如何在cl opengl中为窗口大小配置gl:ortho
我正在尝试在cl opengl中为窗口大小配置如何在cl opengl中为窗口大小配置gl:ortho,opengl,common-lisp,Opengl,Common Lisp,我正在尝试在cl opengl中为窗口大小配置gl:ortho,但不起作用: (总图:视口0(宽度窗口)(高度窗口)) (gl:矩阵模式:投影) (gl:ortho(-(/(宽度窗口)2)(/(宽度窗口)2)((/(高度窗口)2)(/(高度窗口)2)-1.0 1.0) (gl:矩阵模式:模型视图) (gl:负载标识) 与: (宽度窗口)=>800 (高度窗口)=>600 如果我用下面的顶点绘制一个三角形: (垂直方向) -280.0 -280.0 280.0 -280.0)) 我可以看到整
gl:ortho
,但不起作用:
(总图:视口0(宽度窗口)(高度窗口))
(gl:矩阵模式:投影)
(gl:ortho(-(/(宽度窗口)2)(/(宽度窗口)2)((/(高度窗口)2)(/(高度窗口)2)-1.0 1.0)
(gl:矩阵模式:模型视图)
(gl:负载标识)
与:
(宽度窗口)=>800
(高度窗口)=>600
如果我用下面的顶点绘制一个三角形:
(垂直方向)
-280.0 -280.0
280.0 -280.0))
我可以看到整个蓝色屏幕。但如果我尝试使用以下坐标:
(垂直面(0.0.8
-0.8 -0.8
0.8 -0.8))
我在屏幕上看到了蓝色三角形,就好像它没有在gl:ortho
中配置任何东西一样
我哪里做错了?我设法让它工作起来,秘诀是需要将投影矩阵乘以顶点着色器中的位置,如下所示: 下面两个示例的通用功能:
(require :sdl2)
(require :cl-opengl)
(require :cl-glut)
(defun runtime-load-shader (shader-type shader-src)
(let ((shader (gl:create-shader shader-type)))
(gl:shader-source shader shader-src)
(gl:compile-shader shader)
shader))
(defun alloc-array-buffer (verts)
(let ((array-buffer (gl:gen-buffer))
(arr (gl:alloc-gl-array :float (length verts))))
(gl:bind-buffer :array-buffer array-buffer)
(dotimes (i (length verts))
(setf (gl:glaref arr i) (aref verts i)))
(gl:buffer-data :array-buffer :static-draw arr)
(gl:free-gl-array arr)
array-buffer))
(defun create-new-program (program)
(let ((verts #(0.0 280.0
-280.0 -280.0
280.0 -280.0))
(vs (runtime-load-shader :vertex-shader "#version 120
uniform mat4 projectionMatrix;
attribute vec2 coord2d;
void main(void) {
gl_Position = projectionMatrix * vec4(coord2d, 0.0, 1.0);
}
"))
(fs (runtime-load-shader :fragment-shader "#version 120
void main(void) {
gl_FragColor[0] = 0.0;
gl_FragColor[1] = 0.0;
gl_FragColor[2] = 1.0;
}
"))
(coord2d nil))
(gl:attach-shader program vs)
(gl:attach-shader program fs)
(gl:link-program program)
(alloc-array-buffer verts)
(setf coord2d (gl:get-attrib-location program "coord2d"))
(gl:use-program program)
(gl:enable-vertex-attrib-array coord2d)
(gl:vertex-attrib-pointer coord2d
2
:float
:false
0
(cffi:null-pointer))))
(defun draw-triangle ()
(gl:draw-arrays :triangles 0 3))
(defun program-shutdown (program)
(gl:delete-program program))
使用cl glut绘制三角形的示例:
(defclass glut-test-window (glut:window)
((program :accessor program))
(:default-initargs :width 800 :height 600
:mode '(:double :rgb :depth) :title "shader-vao-test"))
(defmethod glut:display-window :before ((w glut-test-window))
(setf (program w) (gl:create-program))
(create-new-program (program w)))
(defmethod glut:display ((w glut-test-window))
(gl:clear-color 0.0 0.0 0.2 1.0)
(gl:clear :color-buffer-bit)
(draw-triangle)
(glut:swap-buffers))
(defmethod glut:reshape ((w glut-test-window) width height)
(gl:viewport 0 0 800 600)
(gl:matrix-mode :projection)
(gl:load-identity)
(gl:ortho -400 400 -300 300 -1.0 1.0)
(when (program w)
(let ((proj-mat (gl:get-float :projection-matrix)))
(gl:uniform-matrix
(gl:get-uniform-location (program w) "projectionMatrix")
4
(vector proj-mat))))
(gl:matrix-mode :modelview)
(gl:load-identity))
(defmethod glut:keyboard ((w glut-test-window) key x y)
(declare (ignore x y))
(case key
(#\Esc (glut:destroy-current-window))))
(defun glut-test ()
(let ((w (make-instance 'glut-test-window)))
(glut:display-window w)
(program-shutdown (program w))))
(glut-test)
使用cl-sdl2绘制三角形的示例:
(defun sdl2-test ()
(sdl2:with-init (:everything)
(sdl2:with-window (win :flags '(:shown :opengl))
(sdl2:with-gl-context (gl-context win)
(let ((program (gl:create-program)))
(create-new-program program)
(gl:viewport 0 0 800 600)
(gl:matrix-mode :projection)
(gl:load-identity)
(gl:ortho -400 400 -300 300 -1.0 1.0)
(when program
(let ((proj-mat (gl:get-float :projection-matrix)))
(gl:uniform-matrix
(gl:get-uniform-location program "projectionMatrix")
4
(vector proj-mat))))
(gl:matrix-mode :modelview)
(gl:load-identity)
(sdl2:with-event-loop (:method :poll)
(:idle ()
(gl:clear :color-buffer)
(gl:color 1.0 0.0 0.0)
(draw-triangle)
(sdl2:gl-swap-window win))
(:quit () t)))))))
(sdl2-test)
悲哀的是必须在所有着色器上乘以投影矩阵