Compression GLSL-将多个0-1颜色(var4)压缩/打包为单个var4变量

Compression GLSL-将多个0-1颜色(var4)压缩/打包为单个var4变量,compression,glsl,bit-shift,glsles,bit-packing,Compression,Glsl,Bit Shift,Glsles,Bit Packing,我尝试在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中进行位移位,所以我必须

我尝试在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
中打包浮动,但我的问题有点不同


谢谢

那么,位移位可以用二次幂的乘法(对于左移位)或除法(对于右移位)来表示。您只需考虑到浮点将选择分数部分,这些分数部分通常在正常整数位移位中被“移出”

因此,要将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

或者更简单的说法是将四个8位通道压缩到一个8位通道的空间中。你的意思是当你编写
var4
vec4
?是的,愚蠢的错误。我的意思是谢谢你的回答。然而,我认为在打包代码中有点不对劲:如果浮点数a、b、c和d被标准化并除以64,那么它们总是0。这个打包代码假设这些变量在0-255范围内吗?@Child:你是对的,我脑子里有一个非标准化的[0255]范围,为什么a试图模拟整数的位移位。我更新了我的答案。谢谢,我在我的代码中做了修改,效果很好!再次感谢。我想解包代码可能还有点不对劲-计算的值在0-0.75范围内,而不是0-1。如果我们以a为例,如果x的值为1.0,我们从第一行得到a=0.75。我不认为这有什么关系,因为它很容易纠正,但我提到它是出于兴趣,并帮助其他使用该代码的人。