你如何在glsl/webgl中将一个32位int打包成4,8位整数?

wil*_*alo 16 javascript glsl webgl glsles

我正在寻找并行化一些复杂的数学,而webgl看起来是完美的方式.问题是,你只能从纹理中读取8位整数.理想情况下,我希望从纹理中获取32位数字.我有想法使用4个颜色通道获得每像素32位,而不是4位8位.

我的问题是,glsl没有"%"运算符或任何按位运算符!

TLDR:如何使用glsl中的运算符将32位数转换为4位数.

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

如何在两个32位整数中存储64位整数并再次转换回来

LJᛃ*_*LJᛃ 24

您可以通过乘以/除以2的幂来进行位移.

正如在评论中指出我最初发布是工作,但不正确的方法,这里有一个由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);
}
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案,谢谢!但是在iOS平台上我必须在DecodeFloatRGBA函数的开头添加这个代码:`v = floor(v*255.0 + 0.5)/ 255.0;`以确保v包含精确的0,1/255,2/255,..., 1值.这是必要的,因为通常"vec4 v"来自texture2D功能,而在某些GPU上(例如在iOS设备中),texture2D返回例如"0.000001"而不是精确的0.0. (3认同)