我希望并行化一些复杂的数学运算,而 webgl 看起来是实现它的完美方式。 问题是,您只能从纹理中读取 8 位整数。 理想情况下,我希望从纹理中获取 32 位数字。 我想到了使用 4 个颜色 channel 来获得每像素 32 位,而不是 4 乘以 8 位。
我的问题是,glsl 没有“%”运算符或任何按位运算符!
长篇大论: 如何使用 glsl 中的运算符将 32 位数字转换为 4 个 8 位数字。
有关该技术的一些额外信息(使用按位运算符):
How to store a 64 bit integer in two 32 bit integers and convert back again
最佳答案
您可以通过乘/除以 2 的幂来进行位移。
正如评论中指出的,我最初发布的方法有效但不正确,here's one by Aras Pranckevičius , 请注意,帖子中的源代码本身包含错字并且是 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);
}
关于javascript - 你如何在 glsl/webgl 中将一个 32 位的整数打包成 4 个、8 位的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18453302/