-1
我试图在我自己的图形引擎中实现色调映射校正,并且我使用asylum2010中的优秀演示(https://github.com/asylum2010/Asylum_Tutorials) 现在看看:这是从着色器上述演示:奇怪的GLSL行为
#version 150
uniform sampler2D sampler0;
uniform vec2 texelSize;
uniform int prevLevel;
in vec2 tex;
out vec4 my_FragColor0;
void main()
{
const vec3 LUMINANCE_VECTOR = vec3(0.2125, 0.7154, 0.0721);
vec4 sample = texture(sampler0, tex + vec2(-0.5, -0.5) * texelSize);
float dt = dot(sample.rgb, LUMINANCE_VECTOR);
if (sample.r > 0.99 && sample.g > 0.99 && sample.b > 0.99)
{
if (dt > 0.9998)
{
if (log(0.0001 + dt) < 1.0) // <== NOTICE THIS!
my_FragColor0 = vec4(0.1, 0.0, 0.0, 1.0);
else
my_FragColor0 = vec4(1.0, 0.0, 0.0, 1.0);
}
else
my_FragColor0 = vec4(0.0, 0.0, 0.0, 1.0);
}
else
my_FragColor0 = vec4(0.0, 0.0, 0.0, 1.0);
}
,这是我写的着色器:
#version 150
uniform sampler2D ColorMap;
uniform vec2 TexelSize;
uniform int PreviousLevel;
in vec2 fragmentUV;
out vec4 fragment;
void main()
{
const vec3 LUMINANCE_VECTOR = vec3(0.2125, 0.7154, 0.0721);
vec4 sample = texture(ColorMap, fragmentUV + vec2(-0.5, -0.5) * TexelSize);
float dt = dot(sample.rgb, LUMINANCE_VECTOR);
if (sample.r > 0.99 && sample.g > 0.99 && sample.b > 0.99)
{
if (dt > 0.9998)
{
if (log(0.0001 + dt) < 1.0) // <== NOTICE THIS!
fragment = vec4(0.1, 0.0, 0.0, 1.0);
else
fragment = vec4(1.0, 0.0, 0.0, 1.0);
}
else
fragment = vec4(0.0, 0.0, 0.0, 1.0);
}
else
fragment = vec4(0.0, 0.0, 0.0, 1.0);
}
你可能会注意到,除了变量名称,代码是完全一样的。 现在,当我在自己的引擎上运行第一个着色器时,它会输出一个全红色,以便传递的采样器的几乎白色像素几乎是白色(r,g和b> 0.99),这意味着对数计算的结果大于1.0
当我运行我自己的着色器(当然通过相同的样本并具有相同的纹理大小)时,它会输出暗红色,这意味着日志结果低于1.0。
它在我看来,第二个着色器的结果是正确的,但这不是重点。关键是:结果如何变得不同?
不确定您是否可以在您的问题上看到接近的选票:*“该问题需要包含重现问题所需的最短代码”*正如您在问题本身已经总结的那样*“代码是完全相同“*所以它清楚的问题是*不是*着色器源代码,因此您的问题不允许有实质性的答案,因为我们可以做的所有事情都是猜测您的”黑箱“代码中可能会做错什么。 –
@LJᛃ感谢您的解释。我现在试着改进我的问题 –