如何用Common Lisp写opengl ES 2.0/3.0?
How to write opengl ES 2.0/3.0 in Common Lisp?
我想写一个在 android 和 linux 中工作的代码,所以我认为我应该从 cl-opengl 开始,但是 android 使用 opengl ES,所以我认为我应该使用 opengl ES 2.0 或 3.0,但我对这一切感到困惑,我使用 sdl2 来创建 window 和 cl-opengl,但是如何在普通的 lisp 中使用 opengl ES?我必须在 opengl ES 中为 Android 编写两个代码,在 opengl 中为 Linux 编写其他代码?或者我可以在 opengl ES 中编写一个适用于两个平台的代码?如何用cl-opengl写opengl ES?我快迷路了。
而且我认为通过 ECL 构建到 Android。
我今天再试一次,我按照下面的教程:
https://pt.wikibooks.org/wiki/Programa%C3%A7%C3%A3o_com_OpenGL/Modern_OpenGL_Introduction
我可以用我在 C 中的代码绘制三角形。但是当我尝试使用 cl-opengl 时却不行:
(unless (gl::features-present-p (>= :glsl-version 1.2))
(format t "Not support glsl 120.~%")
(finish-output))
(let ((buffers (gl:gen-buffers 2))
(vertex-buffer nil)
(arr (gl:alloc-gl-array :float 6))
(verts #(0.0 0.8
-0.8 -0.8
0.8 -0.8))
(vs (gl:create-shader :vertex-shader))
(fs (gl:create-shader :fragment-shader))
(program nil)
(attribute-coord2d nil))
(setf vertex-buffer (elt buffers 0))
(gl:bind-buffer :array-buffer vertex-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)
(gl:shader-source vs *vertex-shader*)
(gl:compile-shader vs)
(gl:shader-source fs *fragment-shader*)
(gl:compile-shader fs)
(setf program (gl:create-program))
(gl:attach-shader program vs)
(gl:attach-shader program fs)
(gl:link-program program)
(setf attribute-coord2d (gl:get-attrib-location program "coord2d"))
(gl:color 1.0 1.0 1.0 1.0)
(gl:clear :color-buffer-bit)
(gl:use-program program)
(gl:enable-vertex-attrib-array attribute-coord2d)
(gl:vertex-attrib-pointer attribute-coord2d
2
:float
:false
0
vertex-buffer)
(gl:draw-arrays vertex-buffer 0 3)
(gl:disable-vertex-attrib-array attribute-coord2d)
(gl:delete-program program))
通过上面的代码我得到:
GL_INVALID_ENUM
可能意味着你在某处传递了错误的常量,它说这发生在 DRAW-ARRAYS
。我以前没有使用过 cl-opengl 或 Common Lisp,但是 glDrawArrays' first parameter should be the type of primitive (在 GL 和 GL ES 中),例如GL_TRIANGLES
。如果 cl-opengl 是 1:1 映射到 GL API,那么我假设你的 (gl:draw-arrays vertex-buffer 0 3)
行是错误的,应该更像 (gl:draw-arrays gl:triangles 0 3)
?
另外 (gl:vertex-attrib-pointer attribute-coord2d 2 :float :false 0 vertex-buffer)
对我来说是可疑的。我认为最后一个参数应该是 0。它在概念上是一个指针,但在现代 OpenGL 和 OpenGL ES 中(当你像现在这样使用数组缓冲区时)它实际上是缓冲区的偏移量。
我想写一个在 android 和 linux 中工作的代码,所以我认为我应该从 cl-opengl 开始,但是 android 使用 opengl ES,所以我认为我应该使用 opengl ES 2.0 或 3.0,但我对这一切感到困惑,我使用 sdl2 来创建 window 和 cl-opengl,但是如何在普通的 lisp 中使用 opengl ES?我必须在 opengl ES 中为 Android 编写两个代码,在 opengl 中为 Linux 编写其他代码?或者我可以在 opengl ES 中编写一个适用于两个平台的代码?如何用cl-opengl写opengl ES?我快迷路了。
而且我认为通过 ECL 构建到 Android。
我今天再试一次,我按照下面的教程:
https://pt.wikibooks.org/wiki/Programa%C3%A7%C3%A3o_com_OpenGL/Modern_OpenGL_Introduction
我可以用我在 C 中的代码绘制三角形。但是当我尝试使用 cl-opengl 时却不行:
(unless (gl::features-present-p (>= :glsl-version 1.2))
(format t "Not support glsl 120.~%")
(finish-output))
(let ((buffers (gl:gen-buffers 2))
(vertex-buffer nil)
(arr (gl:alloc-gl-array :float 6))
(verts #(0.0 0.8
-0.8 -0.8
0.8 -0.8))
(vs (gl:create-shader :vertex-shader))
(fs (gl:create-shader :fragment-shader))
(program nil)
(attribute-coord2d nil))
(setf vertex-buffer (elt buffers 0))
(gl:bind-buffer :array-buffer vertex-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)
(gl:shader-source vs *vertex-shader*)
(gl:compile-shader vs)
(gl:shader-source fs *fragment-shader*)
(gl:compile-shader fs)
(setf program (gl:create-program))
(gl:attach-shader program vs)
(gl:attach-shader program fs)
(gl:link-program program)
(setf attribute-coord2d (gl:get-attrib-location program "coord2d"))
(gl:color 1.0 1.0 1.0 1.0)
(gl:clear :color-buffer-bit)
(gl:use-program program)
(gl:enable-vertex-attrib-array attribute-coord2d)
(gl:vertex-attrib-pointer attribute-coord2d
2
:float
:false
0
vertex-buffer)
(gl:draw-arrays vertex-buffer 0 3)
(gl:disable-vertex-attrib-array attribute-coord2d)
(gl:delete-program program))
通过上面的代码我得到:
GL_INVALID_ENUM
可能意味着你在某处传递了错误的常量,它说这发生在 DRAW-ARRAYS
。我以前没有使用过 cl-opengl 或 Common Lisp,但是 glDrawArrays' first parameter should be the type of primitive (在 GL 和 GL ES 中),例如GL_TRIANGLES
。如果 cl-opengl 是 1:1 映射到 GL API,那么我假设你的 (gl:draw-arrays vertex-buffer 0 3)
行是错误的,应该更像 (gl:draw-arrays gl:triangles 0 3)
?
另外 (gl:vertex-attrib-pointer attribute-coord2d 2 :float :false 0 vertex-buffer)
对我来说是可疑的。我认为最后一个参数应该是 0。它在概念上是一个指针,但在现代 OpenGL 和 OpenGL ES 中(当你像现在这样使用数组缓冲区时)它实际上是缓冲区的偏移量。