2016-12-16 37 views
-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。

它在我看来,第二个着色器的结果是正确的,但这不是重点。关键是:结果如何变得不同?

回答

0

对于感兴趣的人,我终于找到了问题。 错误实际上是点积。我为ColorMap传递了一个内部格式为GL_RGBA的纹理,而它应该是一个浮点纹理,以便存储大于1的值。 另外我想知道我收到的downvote的原因。了解原因将有助于避免我可能提出问题的任何错误。

+1

不确定您是否可以在您的问题上看到接近的选票:*“该问题需要包含重现问题所需的最短代码”*正如您在问题本身已经总结的那样*“代码是完全相同“*所以它清楚的问题是*不是*着色器源代码,因此您的问题不允许有实质性的答案,因为我们可以做的所有事情都是猜测您的”黑箱“代码中可能会做错什么。 –

+0

@LJᛃ感谢您的解释。我现在试着改进我的问题 –