gpt4 book ai didi

opengl-es - 如何将 vec4 rgba 值转换为 float ?

转载 作者:行者123 更新时间:2023-12-02 20:17:20 29 4
gpt4 key购买 nike

我将一些 float 据打包在纹理中作为 unsigned_byte,这是我在 webgl 中唯一的选择。现在我想将其解压到顶点着色器中。当我对一个像素进行采样时,我得到一个 vec4,它实际上是我的 float 之一。如何从 vec4 转换为 float ?

最佳答案

以下代码专门针对使用 OpenGL ES 2.0 的 iPhone 4 GPU。我没有 WebGL 经验,所以我不能声称知道代码在该上下文中如何工作。此外,这里的主要问题是 highp float 不是 32 位,而是 24 位。

我的解决方案是针对片段着色器的 - 我没有在顶点着色器中尝试它,但它不应该有任何不同。为了使用它,您需要从 Sampler2d 制服获取 RGBA 纹素,并确保每个 R、G、B 和 A channel 的值在 0.0 和 255.0 之间。这很容易实现,如下所示:

highp vec4 rgba = texture2D(textureSamplerUniform, texcoordVarying)*255.0;

您应该知道,您的机器的字节顺序将决定字节的正确顺序。上面的代码假设 float 以大端顺序存储。如果您发现结果错误,则只需通过写入

交换数据的顺序
rgba.rgba=rgba.abgr;

紧接在您设置它的行之后。或者交换 rgba 上的索引。我认为上面的代码更直观,并且不太容易出现粗心错误。我不确定它是否适用于所有给定的输入。我测试了大范围的数字,发现decode32和encode32不是精确的逆。我还遗漏了我用来测试它的代码。

#pragma STDGL invariant(all) 

highp vec4 encode32(highp float f) {
highp float e =5.0;

highp float F = abs(f);
highp float Sign = step(0.0,-f);
highp float Exponent = floor(log2(F));
highp float Mantissa = (exp2(- Exponent) * F);
Exponent = floor(log2(F) + 127.0) + floor(log2(Mantissa));
highp vec4 rgba;
rgba[0] = 128.0 * Sign + floor(Exponent*exp2(-1.0));
rgba[1] = 128.0 * mod(Exponent,2.0) + mod(floor(Mantissa*128.0),128.0);
rgba[2] = floor(mod(floor(Mantissa*exp2(23.0 -8.0)),exp2(8.0)));
rgba[3] = floor(exp2(23.0)*mod(Mantissa,exp2(-15.0)));
return rgba;
}

highp float decode32(highp vec4 rgba) {
highp float Sign = 1.0 - step(128.0,rgba[0])*2.0;
highp float Exponent = 2.0 * mod(rgba[0],128.0) + step(128.0,rgba[1]) - 127.0;
highp float Mantissa = mod(rgba[1],128.0)*65536.0 + rgba[2]*256.0 +rgba[3] + float(0x800000);
highp float Result = Sign * exp2(Exponent) * (Mantissa * exp2(-23.0 ));
return Result;
}

void main()
{
highp float result;

highp vec4 rgba=encode32(-10.01);
result = decode32(rgba);
}

以下是我发现有用的一些有关 IEEE 精度的链接。 Link1Link2Link3 .

关于opengl-es - 如何将 vec4 rgba 值转换为 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7059962/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com