gpt4 book ai didi

opengl - 使用常用的 lisp opengl 保存和加载图像

转载 作者:行者123 更新时间:2023-12-04 12:32:16 29 4
gpt4 key购买 nike

我使用 Common Lisp、OpenGL 和 glut 创建了一个图形。具体来说,我正在使用图书馆 cl-opengl .我希望将此图形(通过连接 gl:vertex 点制作)保存到外部文件,以便我可以加载它并在以后的程序中对其进行操作。

  • 如何保存绘制到 glut-window 的图形?
  • 如何从图像文件加载图形?
  • 如何操作加载的图像(例如复制、平移和旋转)?
  • 最佳答案

  • 您可以在 OpenGL 帧渲染例程中使用 glReadPixels 函数来获取 RGB 数据,然后使用拟合库将其保存为图片格式。比如quicklisp存储库中有ZPNG可以写PNG:
    http://www.xach.com/lisp/zpng/#sect-examples
  • 使用图像库从文件中读取图像数据。要遵循我之前使用 PNG 格式的示例,您可以快速加载 png-read并用它来提取RGB数据。
    (png-read:read-png-file #p"/tmp/1.png")
    (png-read:physical-dimensions p) ;returns width and height in meters
    (png-read:image-data p) ;returns a three-dimensional array of bytes
  • 如果您已经在使用 OpenGL,只需启用正交透视模式,使用您的图像作为纹理制作一个四边形面并操纵网格。如果您想在 2D 图像缓冲区 Canvas 上绘画,请选择像 cairo 这样的库。 .

  • 在我的 SBCL 以下作品中:
        (ql:quickload '(:cl-opengl :cl-glu :cl-glut :zpng))

    (defclass hello-window (glut:window) ()
    (:default-initargs :pos-x 100 :pos-y 100 :width 250 :height 250
    :mode '(:single :rgba) :title "hello"))

    (defmethod glut:display-window :before ((w hello-window))
    ;; Select clearing color.
    (gl:clear-color 0 0 0 0)
    ;; Initialize viewing values.
    (gl:matrix-mode :projection)
    (gl:load-identity)
    (gl:ortho 0 1 0 1 -1 1))

    (defmethod glut:display ((w hello-window))
    (gl:clear :color-buffer)
    (gl:color 0.4 1 0.6)
    (gl:with-primitive :polygon
    (gl:vertex 0.25 0.25 0)
    (gl:vertex 0.75 0.25 0)
    (gl:vertex 0.25 0.55 0))
    (gl:flush))

    (defmethod glut:keyboard ((w hello-window) key x y)
    (declare (ignore x y))
    (when (eql key #\Esc)
    (glut:destroy-current-window))
    (when (eql key #\r)
    (let* ((mypng (make-instance 'zpng:png :width 250 :height 250))
    (imagedata (zpng:data-array mypng))
    (sample1 (gl:read-pixels 0 0 250 250 :bgra :unsigned-byte)))
    (format t "read~%")
    (dotimes (i (expt 250 2))
    (multiple-value-bind (h w) (floor i 250)
    (setf (aref imagedata (- 249 h) w 0) (aref sample1 (+ 2 (* i 4))))
    (setf (aref imagedata (- 249 h) w 1) (aref sample1 (+ 1 (* i 4))))
    (setf (aref imagedata (- 249 h) w 2) (aref sample1 (+ 0 (* i 4))))))
    (zpng:write-png mypng #p"/tmp/readpixels.png"))
    (format t "written~%")))

    (defun rb-hello ()
    (glut:display-window (make-instance 'hello-window)))

    按“r”将文件保存在 /tmp/readpixels.png

    关于opengl - 使用常用的 lisp opengl 保存和加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820164/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com