gpt4 book ai didi

c++ - OpenGL : GLSL float has low precision

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:41 24 4
gpt4 key购买 nike

我有包含振幅值的浮点 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

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

最佳答案

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

关于c++ - OpenGL : GLSL float has low precision,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14360343/

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