如何在 GLSL / WebGL 中将 1 个 32 位整数打包为 4 个 8 位整数?

2024-01-19

我正在寻求并行化一些复杂的数学,而 WebGL 看起来是实现这一目标的完美方法。 问题是,您只能从纹理中读取 8 位整数。 理想情况下,我希望从纹理中获取 32 位数字。 我的想法是使用 4 个颜色通道来获得每像素 32 位,而不是 4 乘以 8 位。

我的问题是,GLSL 没有“%”运算符或任何按位运算符!

总括: 如何使用 glsl 中的运算符将 32 位数字转换为 4 个 8 位数字。

有关该技术的一些额外信息(使用按位运算符):

如何将一个 64 位整数存储在两个 32 位整数中并再次转换回来 https://stackoverflow.com/questions/2810280/how-to-store-a-64-bit-integer-in-2-32-bit-integers-and-convert-back-again


您可以通过乘以/除以二的幂来进行位移。

正如评论中指出的,我最初发布的方法有效但不正确,这是 Aras Pranckevičius 的一幅作品 http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/,请注意,帖子中的源代码本身包含一个拼写错误,并且是 HLSL,这是一个已纠正拼写错误的 GLSL 端口:

const vec4 bitEnc = vec4(1.,255.,65025.,16581375.);
const vec4 bitDec = 1./bitEnc;
vec4 EncodeFloatRGBA (float v) {
    vec4 enc = bitEnc * v;
    enc = fract(enc);
    enc -= enc.yzww * vec2(1./255., 0.).xxxy;
    return enc;
}
float DecodeFloatRGBA (vec4 v) {
    return dot(v, bitDec);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 GLSL / WebGL 中将 1 个 32 位整数打包为 4 个 8 位整数? 的相关文章