C++ OpenGL:GLSL浮点精度较低

C++ OpenGL:GLSL浮点精度较低,c++,opengl-es,glsl,C++,Opengl Es,Glsl,我有一个包含振幅值的浮动alpha纹理。它被转换为分贝并以灰度显示 下面是对话代码(C++): 以下是一个屏幕截图: 看起来很完美!现在,我想用片段着色器本身而不是C++编写对话: #version 120 precision highp float; varying vec2 texcoord; uniform sampler2D texture; const float db_min = -100., db_max = 0.; void main() { float value = t

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

下面是对话代码(C++):

以下是一个屏幕截图:

看起来很完美!现在,我想用片段着色器本身而不是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);
}
以下是一个屏幕截图:


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

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

一分钟前有人发布了正确答案,但当我重新刷新页面时,它不在那里(已删除?)。无论如何,问题在于纹理的内部_格式需要是GL_ALPHA32F_ARB而不是GL_ALPHA。然而,请注意,在OpenGLES2中,GL_ALPHA工作得很好。给发布答案的人:请重新发布它。=)我投票取消了它。如果您需要,请复制它:“:这取决于纹理的内部格式。您必须使用
GL\u RGBA32F
(这是2.1中的ARB扩展),或者可能使用
GL\u RGBA32I
GL\u GRBA32UI
#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);
}
#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);
}