【问题标题】:How to write opengl ES 2.0/3.0 in Common Lisp?如何在 Common Lisp 中编写 opengl ES 2.0/3.0?
【发布时间】:2019-12-06 15:30:02
【问题描述】:

我想写一个在android和linux下都可以运行的代码,所以我认为我应该从cl-opengl开始,但是android使用opengl ES,所以我认为我应该使用opengl ES 2.0或3.0,但是我对这一切感到困惑,我使用 sdl2 来创建窗口和 cl-opengl,但是如何在 common lisp 中使用 opengl ES?我必须在 opengl ES for Android 中编写两个代码,在 opengl for 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))

通过上面的代码,我得到:

【问题讨论】:

    标签: opengl-es common-lisp


    【解决方案1】:

    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 是到 GL API 的 1:1 映射,那么我假设您的 (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(当你像你一样使用数组缓冲区时)它实际上是缓冲区的偏移量。

    【讨论】:

    • 你是对的,是(gl:draw-arrays :triangles 0 3)。但是现在我只有黑屏,看不到三角形。
    • 我是否正确使用了attribute-coord2d?它只有一个整数,对吗?
    • 我认为这是对的,但gl:vertex-attrib-pointer attribute-coord2d 2 :float :false 0 vertex-buffer) 对我来说很可疑。我认为最后一个参数应该是0,它名义上是一个指针,但在现代 OpenGL 和 OpenGL ES(当你使用数组缓冲区时)它实际上是缓冲区的偏移量。
    • 你说“在 GL 和 GL ES 中”,我还是很困惑,在上面的代码中我使用 GL ES,我是对的吗?因为我已经看到了带有“GL ES”的“包含”的代码示例,因为这是一个不同的库,但我知道 opengl ES 在 opengl 库中,并且只是函数将使用的一种“模式”。我是对的?
    • 你又是对的,最后一个参数应该是(cffi:null-pointer),现在我看到了屏幕上的蓝色三角形。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2011-03-08
    • 1970-01-01
    • 2018-12-13
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多