如何在 WebGL GLSL 中解压 4 字节 Int Uniform 的每个字节?
How to Unpack Each Byte of a 4-byte Int Uniform in WebGL GLSL?
WebGL 不支持按位运算。所以我把我的 int
制服换成了 float
。然后使用除法和mod提取每个字节。
但是,由于精度问题,如果我的 int
太大,将 int
转换为 float
会损失一些精度。有什么优雅的解决方案可以解决这个问题吗?目前我的想法是在我的 4 字节 int
制服中只存储 3 个字节。
你不是 100% 清楚你想做什么。首先,了解一个 32 位浮点数有 23 位尾数。那是一个小于 3 个字节的。此外,您的着色器可能 运行 精度较低,例如 fp16 或 8.8 定点。所以你的问题的答案是:没有。
退后一步,想想为什么要在低端着色器中使用整数。通常 mod 技巧用于将浮点值打包(和解包)到 rgba 字节纹理或帧缓冲区中。
对于制服来说,这没什么意义。着色器仍将以低(浮点)精度 运行。所以你做的任何数学运算最多 运行 23 位。你可以提供它作为漂浮制服。
WebGL 不支持按位运算。所以我把我的 int
制服换成了 float
。然后使用除法和mod提取每个字节。
但是,由于精度问题,如果我的 int
太大,将 int
转换为 float
会损失一些精度。有什么优雅的解决方案可以解决这个问题吗?目前我的想法是在我的 4 字节 int
制服中只存储 3 个字节。
你不是 100% 清楚你想做什么。首先,了解一个 32 位浮点数有 23 位尾数。那是一个小于 3 个字节的。此外,您的着色器可能 运行 精度较低,例如 fp16 或 8.8 定点。所以你的问题的答案是:没有。
退后一步,想想为什么要在低端着色器中使用整数。通常 mod 技巧用于将浮点值打包(和解包)到 rgba 字节纹理或帧缓冲区中。
对于制服来说,这没什么意义。着色器仍将以低(浮点)精度 运行。所以你做的任何数学运算最多 运行 23 位。你可以提供它作为漂浮制服。