Zeb*_*ish 3 c++ arrays opengl indexing graphics
有两个 OpenGL 文档页面对 glDrawElements 函数的“index”参数的描述略有不同。在 www.opengl.org/sdk/docs/man4/ 它说:
indices
Specifies a pointer to the location where the indices are stored.
Run Code Online (Sandbox Code Playgroud)
在 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.
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我在 Windows 上,使用 OpenGL 4+。
所以我已经将我的索引数组复制到我创建的元素缓冲区对象中,我需要提供的索引指针参数是第一个索引的偏移量(以字节为单位)?因此,如果我想在索引 3 处开始绘图,则参数将是 2 * sizeof(GLuint),将其转换为指针?
我实际上为此努力创建了一个 EBO,但从它的外观来看,它表示如果没有绑定 EBO,则指针直接指向索引所在的位置,而不是 EBO。我是否正确,这意味着它将指向系统 RAM 上的阵列?(编辑:我刚刚意识到这没有意义,如果指针在 0x00000008 处,它就不能转到系统内存中的那个地址。)如果是这样,它是否每次都将索引数组复制到显卡为了能够使用它?谢谢。
根据 OpenGL 4.5 核心配置文件,不支持从客户端内存读取(§10.3.10 OpenGL 4.5 核心规范):
DrawElements、DrawRangeElements和DrawElementsInstanced从名称绑定 到的缓冲区对象中获取
ELEMENT_ARRAY_BUFFER
它们的索引,使用它们的索引参数作为缓冲区对象的偏移量,其方式与第 10.3.9 节中描述的相同。[...] 如果将 0 绑定到ELEMENT_ARRAY_BUFFER
,则这些绘图命令的结果是未定义的。
因此,您创建 EBO 的方法是正确的。除非您的第 0 个索引位于偏移量 0 处,否则第 3 个索引位于 offset 处3*sizeof(type)
。
至于您的第二个引用:在较旧的 OpenGL 版本中,您可以将指针传递给客户端内存(在您的进程虚拟地址空间中,而不是物理地址中)并保持ELEMENT_ARRAY_BUFFER
未绑定状态。