【问题标题】:glVertexAttribPointer - OpenGLES/OpenGLglVertexAttribPointer - OpenGLES/OpenGL
【发布时间】: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


【解决方案1】:
public static FloatBuffer createFloatBuffer(float[] coords) {
    // Allocate a direct ByteBuffer, using 4 bytes per float, and copy coords into it.
    ByteBuffer bb = ByteBuffer.allocateDirect(coords.length * SIZEOF_FLOAT);
    bb.order(ByteOrder.nativeOrder());
    FloatBuffer fb = bb.asFloatBuffer();
    fb.put(coords);
    fb.position(0);
    return fb;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多