我很困惑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
两者都是正确的.这2个案例涉及索引缓冲区如何上传到GL硬件以及如何使用它绘制.这些描述如下:
(1)不使用VBO(顶点缓冲区对象):
在这种情况下,参数指示指向索引数组的指针.每次glDrawElements
调用时,缓冲区都上传到GL HW.
(2)使用VBO:
对于这种情况 - 请参阅索引的定义为"指定一个字节偏移量(强制转换为指针类型)到绑定到GL_ELEMENT_ARRAY_BUFFER的缓冲区中以开始从"读取索引.这意味着数据已经单独使用上传glBufferData
,并且索引仅用作偏移量.每次glDrawElements
调用时,都不会上传缓冲区,但只有偏移量可以根据需要更改.这使得它更有效,特别是涉及大量顶点的情况.