【发布时间】:2017-11-22 16:44:00
【问题描述】:
我正在尝试将 OpenGLES 代码移植到 OpenGL,但我对 glVertexAttribPointer 有点困惑。以下是部分 OpenGLES 代码:
//DRAWING OBJECT
// Get buffers from mesh
Mesh mesh = obj.getMesh();
FloatBuffer _vb = mesh.get_vb();
ShortBuffer _ib = mesh.get_ib();
short[] _indices = mesh.get_indices();
//the vertex info
_vb.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
gl.glVertexAttribPointer(gl.glGetAttribLocation(shader.get_program(), "aPosition"), 3, gl.GL_FLOAT, false,TRIANGLE_VERTICES_DATA_STRIDE_BYTES, _vb);
gl.glEnableVertexAttribArray(gl.glGetAttribLocation(shader.get_program(), "aPosition"));
// Draw with indices
gl.glDrawElements(gl.GL_TRIANGLES, _indices.length, gl.GL_UNSIGNED_SHORT, _ib);
那么如何使用 OpenGL 创建缓冲区?因为在 OpenGLES 中,顶点直接取自 glVertexAttribArray 函数中的当前数组缓冲区。 我尝试使用 glBufferData 但它没有用。
【问题讨论】:
-
您在这里指的是哪个版本的 OpenGL ES?我一般会避免使用客户端(非 VBO)内存,尤其是在 GLES2 类硬件(或者一般来说,任何不与 CPU 共享内存的硬件)上。在所有情况下,GLES 从 1.0 开始就支持缓冲区对象,因此您可以像在常规 OpenGL 中一样使用 VBO。
-
版本是2.0。 glVertexAttribPointer 的最后一个参数是指向顶点缓冲区的指针(它是一个 FloatBuffer)。但我不能在 OpenGL 中以同样的方式使用。我尝试在初始化中使用以下代码,但没有成功:glGenBuffers(1,&buffer); glBindBuffer(GL_ARRAY_BUFFER,buffer); glBufferData(GL_ARRAY_BUFFER,sizeof(_vb),_vb,GL_STATIC_DRAW);有什么建议吗?
-
如果您使用 VBO,请将
0L传递给glVertexAttribPointer (...),而不是_vb。如果您使用 VBO,则不能使用客户端内存地址(在这种情况下为FloatBuffer)作为顶点属性指针位置。使用 VBO 时,地址应该是您调用函数时绑定的 VBO 分配的内存的偏移量。 -
哦,我明白了,谢谢!但是现在当我调用 glBindBuffer 时,它会生成访问冲突错误。你知道它是什么吗?再次感谢。
-
不,也许如果您更新了代码清单可能会有所帮助。
标签: c++ opengl opengl-es buffer