目前我有一个动态VBO(每帧更新一次,粒子系统)。 我发送了4个漂浮物用于pos和4个漂浮物用于颜色。
如果我转移到half_float数据类型,我可以期待多少穿孔?它是5%还是30%?
让我们假设我想以点精灵发送100k ... 500k粒子。 所以我发送大约100k * 8 * 4bytes = ~3MB
当然我知道各种GPU之间可能存在差异......
答案 0 :(得分:2)
每次更改数据时,为每次浮点数保存的2个字节的转换,从全浮点数转换为半浮点数的费用更高。
因此,从长远来看,检查什么可以为您节省更多,更少的内存带宽或花费更多时间来填充VBO。如果CPU经常处于空闲状态(等待vsync),那么以cpu时间为代价优化带宽将会胜出,但是如果花费大量时间在CPU上进行物理操作那么你就无法转换为半浮动
除非你有一个very efficient conversion函数用于通常不内置的类型,并且你可以承受CPU命中率,否则我不会打扰。
鉴于您正在寻找更紧凑的数据格式,我建议使用线性标度(u)int16(将uniform设置为true以将{-32768,32767}映射到{-1,1}或{0,65565}相反,如果你不需要接近0的精度,那么这将提供更好的准确性。
答案 1 :(得分:1)
开始时很可能不需要4个颜色浮点数。
你可能可以使用4个无符号字节。从8位定点数到浮点数的转换在GPU上是非常便宜的(这是他们最初设计的那样),因此您可以将颜色内存需求降低75%而不会产生固有的性能影响。当然,正如其他人所提到的,对齐成为一个问题。从16字节更改为4字节颜色很容易弄乱vec4对齐的顶点数据结构,除非您填充它,添加一些额外的属性(比如说3D顶点法线)或更改数据结构的另一个成员。
vec3
位置加上4字节颜色非常适合缓存边界,除非您实际使用非 1.0 齐次坐标(严重)?这将为您提供与将所有内容切换为半浮点数相同的内存要求,但您仍然可以获得完全精确的位置。