2013-05-08 79 views
0

请问glDrawArrays修改glVertexAttribPointer地址吗?glDrawArrays修改属性地址

我偶然发现了这个问题,当我试图缓存glVertexAttribPointer调用,并且如果我没有在每个glDrawArrays之后重新应用glVertexAttribPointer调用时出现访问冲突异常。这是正常行为还是驱动程序错误?

回答

3

请问glDrawArrays修改glVertexAttribPointer地址吗?

我摇摇晃晃地到这个问题时,我试图缓存glVertexAttribPointer调用

请解释(理想情况下显示源代码)你是怎么做到实现这个“缓存”。

+0

缓存非常简单,它只是检查上次使用的“顶点声明”是否是他自己,代码如下:https://gist.github.com/greenboxal/e2872b85160bd286cd78 如果我重新应用此注释如果)它在glDrawArrays之前的每一帧。 我使用VBOs时,baseAddress始终为0。 – greenboxal 2013-05-08 21:58:35

+0

@greenboxal:您能保证程序的其他部分不会更改glVertexAttribPointer吗?诚实:这种“优化”是一种微不足道的努力。更重要的是,写得很好的OpenGL驱动程序与您执行的检查完全相同,因此您什么也没有得到,但由于您的程序和OpenGL驱动程序被严格的API隔开,驱动程序可以保证此检查是有效的。 – datenwolf 2013-05-08 22:10:56

+0

我看到了,我会接受你的回答,并删除,如果只有一件事,在OpenGL上有什么地方这种优化是值得的?纹理,缓冲区等...... – greenboxal 2013-05-08 22:39:54

0

当您的顶点属性指针超出您正在读取的缓冲区的内存范围时,会发生访问冲突。

你是如何缓存这些调用的?如果您不禁用顶点attrib数组,则以前设置的信息将仍然存在,并且仍会尝试从新的VBO读取。