glDrawElements中index参数的含义是什么?

时间:2016-11-27 08:03:00

标签: c++ arrays opengl indexing graphics

有两个OpenGL文档页面对" index"的描述略有不同。 glDrawElements函数的参数。在www.opengl.org/sdk/docs/man4/上说:

indices
    Specifies a pointer to the location where the indices are stored. 

在www.khronos.org/opengles/sdk/docs/man3上说:

indices
    Specifies a byte offset (cast to a pointer type) into the buffer bound 
    to GL_ELEMENT_ARRAY_BUFFER to start reading indices from. If no buffer
    is bound, specifies a pointer to the location where the indices are stored. 

顺便说一句,我使用的是OpenGL 4 +。

所以我将索引数组复制到我创建的元素缓冲区对象中,我需要提供的索引指针参数是第一个索引的字节偏移量?所以,如果我想在索引3处开始绘制,那么参数将是2 * sizeof(GLuint),作为指针转换?

我实际上是为此创建了一个EBO,但从它的外观来看,如果没有绑定EBO,指针指向指向的位置,而不是EBO。我是对的,这意味着它会指向系统RAM上的阵列吗? (编辑:我刚刚意识到这没有意义,如果指针位于0x00000008,它就不能转到系统内存中的那个地址。)如果是,那么它是否会将索引数组复制到图形中卡每次都能用到它吗?感谢。

1 个答案:

答案 0 :(得分:2)

根据OpenGL 4.5,核心配置文件不支持从客户端内存读取(§10.3.10OpenGL4.5核心规范):

  

DrawElements DrawRangeElements DrawElementsInstanced 从名称绑定到的缓冲区对象中获取其索引   ELEMENT_ARRAY_BUFFER,使用 indices 参数作为偏移量进入缓冲区对象,方法与第10.3.9节中描述的相同。 [...]如果零绑定到ELEMENT_ARRAY_BUFFER,则这些绘图命令的结果是未定义的。

因此,您创建EBO的方法是正确的。除非您的第0个索引位于偏移零,否则第3个索引位于偏移3*sizeof(type)

至于你的第二个引用:在较旧的OpenGL版本中,你可以传递指向客户端内存的指针(在你的进程虚拟地址空间,而不是物理地址),并保持ELEMENT_ARRAY_BUFFER不绑定。