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

Cas*_*yas 10 c++ opengl

我很困惑glDrawElements().我正在按照一个教程说,第四个参数glDrawElements()是"Offset in the 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

Pra*_*ndh 8

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

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

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

(2)使用VBO:

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


BЈо*_*вић 6

如果使用直接绘图,则

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

这意味着,您需要创建VAO,将其绑定,然后glDrawElements()用于渲染

  • VAO是关键!我创建了VAO,但创建了EBO之后。为了进一步向他人说明:您需要在EBO和VBO之前创建VAO,并将这些缓冲区绑定到VAO才能正常工作。 (2认同)