【问题标题】:How to Unpack Each Byte of a 4-byte Int Uniform in WebGL GLSL?如何在 WebGL GLSL 中解压 4 字节 Int Uniform 的每个字节?
【发布时间】:2017-06-30 11:57:26
【问题描述】:

WebGL 不支持按位操作。所以我将我的int 制服转换为float。然后用除法和取模提取每个字节。

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

【问题讨论】:

    标签: glsl webgl


    【解决方案1】:

    您想做什么并不是 100% 清楚的。首先,意识到 32 位浮点数有 23 位尾数。那是一个小于 3 个字节的 1。此外,您的着色器可能会以较低的精度运行,例如 fp16 或 8.8 定点。所以你的问题的答案是:不。

    退后一步,想想你为什么要在低端着色器中使用整数。通常,mod 技巧用于将浮点值打包(和解包)到 rgba 字节纹理或帧缓冲区中。

    对于制服来说,这没什么意义。着色器仍将以低(浮点)精度运行。所以你做的任何数学运算最多只能运行 23 位。您可以将其作为浮动制服提供。

    【讨论】:

    • 我想将一个 1 字节数组传递给 GPU,但 WebGL 不支持 1 字节统一。所以我想把它打包成一个4字节的uniform,然后在shader中解压。
    • 直接作为浮点数传递即可。如果它有很多字节,请将其作为纹理传递。您可以为每个浮点制服传递 2 个字节,但我真的不会依赖它。你不能精确地超过 2 个字节,因为浮点数只有 23 位尾数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2011-07-06
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多