【发布时间】:2012-01-16 02:31:38
【问题描述】:
我需要决定是否应该将 GL_UNSIGNED_SHORT 或 GL_FLOAT 用于我的(静态)VBO 作为顶点。短裤使用的内存减少了 2 倍,但它是否也会降低渲染速度(因为 GPU 必须将它们转换为浮点数)?纹理坐标也一样,我可以将 GL_UNSIGNED_BYTE 用于较小的纹理,将 GL_UNSIGNED_SHORT 用于较大的纹理(使用纹理矩阵映射到 0-1),但我担心它可能会降低渲染速度。
【问题讨论】:
我需要决定是否应该将 GL_UNSIGNED_SHORT 或 GL_FLOAT 用于我的(静态)VBO 作为顶点。短裤使用的内存减少了 2 倍,但它是否也会降低渲染速度(因为 GPU 必须将它们转换为浮点数)?纹理坐标也一样,我可以将 GL_UNSIGNED_BYTE 用于较小的纹理,将 GL_UNSIGNED_SHORT 用于较大的纹理(使用纹理矩阵映射到 0-1),但我担心它可能会降低渲染速度。
【问题讨论】:
对于任何现代硬件(支持 DX10 或更好),您可以假设属性读取性能始终由内存访问决定,而不是由整数到浮点数的转换决定。本质上它是免费的。
这对于 DX9 类硬件也是如此,但有些硬件有某些顶点格式,它不能很好地工作。
话虽如此,我不太确定能否将无符号字节用于纹理坐标。在大多数模型中,您通常需要比 per-texel 更高的纹理坐标精度。无符号短裤通常没问题,但字节精度不够。
【讨论】:
将short 转换为float 应该是一个相当便宜的操作。我认为节省的内存带宽将超过额外的处理成本。
但如果没有实际测试,这只是一个疯狂的猜测。
【讨论】: