首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Common Lisp编写opengl ES 2.0/3.0?

如何用Common Lisp编写opengl ES 2.0/3.0?
EN

Stack Overflow用户
提问于 2019-12-05 07:08:30
回答 1查看 296关注 0票数 2

我想写一个可以在安卓和linux下工作的代码,所以我认为我应该从cl- opengl开始,但是android使用opengl ES,所以我认为我应该使用opengl es2.0或3.0,但我对这一切感到困惑,我使用sdl2创建窗口和cl-opengl,但是如何在常见的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时,不要:

代码语言:javascript
复制
(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))

使用上面的代码,我得到了:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-06 04:41:35

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的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中(当您使用数组缓冲区时),它实际上是缓冲区的偏移量。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59185887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档