GLSL - compressing/packing 多个 0-1 颜色 (var4) 到单个 var4 变量
GLSL - compressing/packing multiple 0-1 colours (var4) into a single var4 variable
我正在尝试在 GLSL 2 es 中执行以下操作:
给定一定数量(例如 4)的标准化 var4
变量 (RGBA) 减少它们的位深度并将结果打包在单个 0-1 钳位 var4
中。这将存储为 8 位(每通道)纹理,然后解压缩。 我知道这会导致质量下降,但这是可以接受的。
所以在这个例子中:
RGBA 8 位
->
减少为RGBA 2位
->
与其他 3 个 RGBA 2 位打包 var4s
->
保存为单个 8 位 RGBA 纹理
->
解压回 4 x RGBA 2 位变量
->
缩小到原始质量的降低版本。
我意识到我不能在 GLSL 中进行位移,所以我必须做一些乘法的集合,到目前为止,我还没有掌握乘法的神奇组合!其他人在 vec4s
中谈到了包装浮点数,但我的问题有点不同。
谢谢!
好吧,位移位可以用乘法运算(左移)或除法运算(右移)表示为 2 的幂。您只需要考虑到浮点数将对小数部分进行排序,这些小数部分通常会在正常的整数位移位中移位"out"。
所以要将 4 个标准化浮点数 a
、b
、c
、d
打包成一个标准化浮点数 x
,您可以简单地使用
x = 1.0/255.0 * (floor(a*255.0/64.0)*64.0 + floor(b*255.0/64.0)*16.0 + floor(c*255.0/64.0)*4.0 + floor(d*255.0/64.0));
解包有点复杂,因为您不能简单地屏蔽单个位。相反,您可以在重构时减去最高有效位,例如:
a = floor(x*255.0/64.0)*64.0/255.0;
x -= a;
b = floor(x*255.0/16.0)*16.0/255.0;
x -= b;
b *= 4.0;
c = floor(x*255.0/4.0)*4.0/255.0;
x -= c;
c *= 16.0;
d = x*255.0 * 64.0 / 255.0; // scan be simplified to just x*64.0
我正在尝试在 GLSL 2 es 中执行以下操作:
给定一定数量(例如 4)的标准化 var4
变量 (RGBA) 减少它们的位深度并将结果打包在单个 0-1 钳位 var4
中。这将存储为 8 位(每通道)纹理,然后解压缩。 我知道这会导致质量下降,但这是可以接受的。
所以在这个例子中:
RGBA 8 位
->
减少为RGBA 2位
->
与其他 3 个 RGBA 2 位打包 var4s
->
保存为单个 8 位 RGBA 纹理
->
解压回 4 x RGBA 2 位变量
->
缩小到原始质量的降低版本。
我意识到我不能在 GLSL 中进行位移,所以我必须做一些乘法的集合,到目前为止,我还没有掌握乘法的神奇组合!其他人在 vec4s
中谈到了包装浮点数,但我的问题有点不同。
谢谢!
好吧,位移位可以用乘法运算(左移)或除法运算(右移)表示为 2 的幂。您只需要考虑到浮点数将对小数部分进行排序,这些小数部分通常会在正常的整数位移位中移位"out"。
所以要将 4 个标准化浮点数 a
、b
、c
、d
打包成一个标准化浮点数 x
,您可以简单地使用
x = 1.0/255.0 * (floor(a*255.0/64.0)*64.0 + floor(b*255.0/64.0)*16.0 + floor(c*255.0/64.0)*4.0 + floor(d*255.0/64.0));
解包有点复杂,因为您不能简单地屏蔽单个位。相反,您可以在重构时减去最高有效位,例如:
a = floor(x*255.0/64.0)*64.0/255.0;
x -= a;
b = floor(x*255.0/16.0)*16.0/255.0;
x -= b;
b *= 4.0;
c = floor(x*255.0/4.0)*4.0/255.0;
x -= c;
c *= 16.0;
d = x*255.0 * 64.0 / 255.0; // scan be simplified to just x*64.0