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但我的问题有点不同。

谢谢!

4

1 回答 1

0

好吧,位移可以用二的幂的乘法(左移)或除法(右移)来表示。您只需要考虑到浮点数会影响小数部分,这些小数部分通常会在正常整数位移中“移出”。

a因此,要将 4 个标准化浮点数、bc、打包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
于 2015-05-16T01:23:12.730 回答