glDrawElements中的第四个参数是什么?

时间:2014-02-11 15:32:07

标签: c++ opengl

我对glDrawElements()感到困惑。我正在按照一个教程说明glDrawElements()的第四个参数是“GL_ELEMENT_ARRAY_BUFFER内的偏移”。但我有一个错误“访问声音:尝试读取0x0000”,如果我传递0作为偏移量。

所以我深入研究了这个问题,发现OpenGL文档提供了第四个参数的两个不同定义:

第一:

  

indices:指定一个字节偏移量(强制转换为指针类型)   缓冲区绑定到GL_ELEMENT_ARRAY_BUFFER以开始读取索引   从

(在此处找到:https://www.opengl.org/wiki/GLAPI/glDrawElements

第二

  

indices:指定指向存储索引的位置的指针。

(在此处找到:https://www.opengl.org/sdk/docs/man4/index.php 在这里:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glDrawElements.xml

哪一个是真的,如何正确使用?

编辑:这是我的代码:http://pastebin.com/fdxTMjnC

4 个答案:

答案 0 :(得分:7)

两者都是正确的。这2个案例涉及索引缓冲区如何上传到GL硬件以及如何使用它绘制。这些描述如下:

(1)不使用VBO(顶点缓冲区对象):

在这种情况下,参数表示指向索引数组的指针。每次调用glDrawElements时,缓冲区都会上传到GL HW。

(2)使用VBO:

对于这种情况 - 请将Index的定义看作“指定一个字节偏移量(强制转换为指针类型)到绑定到GL_ELEMENT_ARRAY_BUFFER的缓冲区中以开始从”读取索引。这意味着数据已使用glBufferData单独上载,索引仅用作偏移量。每次调用glDrawElements时,都不会上载缓冲区,但只有偏移量可以根据需要更改。这使得它更有效,特别是在涉及大量顶点的情况下。

答案 1 :(得分:3)

如果您使用direct drawing,那么

  

indices定义索引缓冲区对象的偏移量(绑定到GL_ELEMENT_ARRAY_BUFFER,存储在VAO中)以开始读取数据。

这意味着,您需要创建VAO,绑定到它,然后使用glDrawElements()进行渲染

答案 2 :(得分:1)

该参数的解释取决于内部数组是否已在GL状态机中绑定。如果绑定了这样的数组,那么它就是一个偏移量。如果没有绑定这样的数组,它就是指向你内存的指针。

使用内部数组效率更高,因此最近的文档(特别是wiki)强烈偏向于这种用法。但是,设置它们需要很长的歌舞。

绑定或取消绑定内部数组的函数是glBindVertexArray。查看文档以了解这些相关功能:

  • glGenVertexArrays
  • glBufferData

(这是一个不完整的列表。我必须运行所以我以后必须编辑。)

答案 3 :(得分:0)

无论在opengl.org/wiki上是什么,最有可能是正确的。我可以从工作项目中告诉你,确实定义如下:

Specifies a byte offset (cast to a pointer type) into the buffer bound to
GL_ELEMENT_ARRAY_BUFFER​ to start reading indices from.

只需将一些整数转换为GLvoid *就可以了。至少对于现代可编程管道来说,我不知道固定管道(也不应该使用它!)。

如果您使用现代管道,没有进一步的信息,我会打赌实际功能没有正确加载。那是GLEW没有正确初始化,或者你是在手动尝试在win32上使用GetProcAddress(看看glDrawElements是1.1以来的核心,而1.0 / 1.1不应该在win32上加载GetProcAddress)。

确实注意到你应该像其他人所说的那样将元素缓冲区绑定到绑定点。虽然在实践中你可以在不绑定V​​AO的情况下逃脱它。我在NVidia,AMD甚至英特尔都做过这个。但在生产中你应该使用VAO。