2017-03-22 32 views
0

我有一个运行于每个顶点6个字节的一些打包的顶点数据:GLES2.0 glVertexAttribPointer:使用奇数Stride和Offset值的性能损失?

glVertexAttribPointer Shader.pos3d_loc, 3, GL_UNSIGNED_BYTE, True, 6, 0 
glVertexAttribPointer Shader.norm_loc, 3, GL_UNSIGNED_BYTE, True, 6, 3 

是否有通过使用不的4个字节的倍数的进步和偏移引起的任何性能损失(如隐藏的内存拷贝)?

+0

此时不做任何复制。您可以将数据复制到顶点缓冲区,或者根据需要逐个访问这些值。这些值只是告诉openGL如何解释你的缓冲区。例如normal [i] .x =(float)((ubyte)(((void *)ptr)[stride * i]))其中ubyte来自GL_UNSIGNED_BYTE参数。 –

+0

谢谢:)我明白这个函数的功能,但我知道有几个对齐和格式相关的陷阱,GL会以很大的性能代价在内部无声地转换数据。我想知道是否指定奇数步长和对齐会导致GL在最终呈现调用发生时在内部重新缓冲数据。 – Peeling

回答

0

简短的回答是“这取决于”:

在PC和(至少部分)的Android设备,有一个以这种方式紧密包装3组件的属性没有明显的点球。

关于IOS(反正写这篇文章),会有很大的性能损失。 IOS GL实现内部解包并对齐任何不是4字节对齐的属性,导致内存和CPU命中。除非您使用动态VBO,否则CPU命中可能不明显。