【发布时间】:2017-03-22 10:33:24
【问题描述】:
我有一些打包的顶点数据,每个顶点运行到 6 个字节:
glVertexAttribPointer Shader.pos3d_loc, 3, GL_UNSIGNED_BYTE, True, 6, 0
glVertexAttribPointer Shader.norm_loc, 3, GL_UNSIGNED_BYTE, True, 6, 3
使用不是 4 字节的倍数的步幅和偏移量是否会导致任何性能损失(例如隐藏的内存副本)?
【问题讨论】:
-
此时没有复制。您要么将数据复制到顶点缓冲区,要么根据需要逐一访问这些值。这里的这些值只是告诉 OpenGL 如何解释你的缓冲区。例如 normal[i].x = (float)((ubyte)(((void*)ptr)[stride*i])) 其中 ubyte 来自 GL_UNSIGNED_BYTE 参数。
-
谢谢 :) 我了解该函数的作用,但我知道有一些与对齐和格式相关的陷阱,其中 GL 会在内部默默地转换数据,但会付出巨大的性能代价。我想知道指定一个奇怪的步幅和对齐是否会促使 GL 在最终渲染调用发生时在内部重新缓冲数据。
标签: performance opengl-es-2.0 stride