2017-06-30 53 views
0

WebGL不支持位操作。所以我把我的int制服转换成float。然后使用除法和mod来提取每个字节。如何在WebGL GLSL中解压缩4字节Int统一字节的每个字节?

但是,由于精度问题,如果我的int太大,将int转换为float会失去一些精度。有没有优雅的解决方案来处理这个问题?目前我的想法是只在我的4字节int制服中存储3个字节。

回答

0

这不是100%清楚你想要做什么。首先,认识到32位浮点数有23位尾数。这是一个不到3个字节。另外,着色器可能运行精度较低,如fp16或8.8固定点。所以你的问题的答案是:No.

退一步,想想你为什么要在低端着色器中输入整数。通常,模式技巧用于将float值打包(并解包)到rgba字节纹理或帧缓冲区中。

对于制服来说,这是毫无意义的。着色器仍然会以低(浮点)精度运行。所以你做的任何数学运算最多只能运行23位。而且你可以像漂浮的制服一样提供。

+0

我想传递一个1字节的数组到GPU,但WebGL不支持1字节的统一。所以我想把它打包成一个4字节的制服,并将其打包在着色器中。 –

+0

只需将其直接作为浮点传递即可。如果它有很多字节,则将其作为纹理传递。你可以传递每个float制服2个字节,但我真的不会依赖它。由于浮点数只有23位尾数,所以不能超过2个字节。 – starmole