作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将一些 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);
}
关于opengl-es - 如何将 vec4 rgba 值转换为 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7059962/
我是一名优秀的程序员,十分优秀!