OpenGL:GLSL浮点数精度低

时间:2013-01-16 14:11:48

标签: c++ opengl-es glsl

我有包含幅度值的浮点alpha纹理。它被转换为分贝并以灰度显示。

这是会话代码(C ++):

const float db_min = -100, db_max = 0;
float image[height][width];
for (int y = 0; y<height; ++y) {
  for (int x = 0; x<width; ++x) {
    image[y][x]= 20.f * log(a[i])/log(10.f);
    image[y][x] = (image[y][x]-db_min)/(db_max-db_min);
  }
}

这是片段着色器(GLSL):

#version 120
precision highp float;
varying vec2 texcoord;
uniform sampler2D texture;
void main() {
  float value = texture2D(texture, texcoord).a;
  gl_FragColor = vec4(value, value, value, 0);
}

以下是截图: enter image description here

看起来很完美!现在,我想在Fragment Shader中编写对话,而不是C ++:

#version 120
precision highp float;
varying vec2 texcoord;
uniform sampler2D texture;
const float db_min = -100., db_max = 0.;
void main() {
  float value = texture2D(texture, texcoord).a;
  value = 20. * log(value)/log(10.);
  value = (value-db_min)/(db_max-db_min);
  gl_FragColor = vec4(value, value, value, 0);
}

以下是截图: enter image description here

为什么结果不同?我做错了什么?

1 个答案:

答案 0 :(得分:2)

有限的纹素精度 - 这可能是问题所在。我可以猜测你在8位每通道纹理(例如RGBA8)中保持你的(非常高的范围,因为我理解log)值。然后,您可以使用浮点格式或将高精度/范围值打包为4字节格式(例如固定点)。