Opengl 奇怪的GLSL行为

Opengl 奇怪的GLSL行为,opengl,glsl,Opengl,Glsl,我试图在我自己的图形引擎中实现色调映射校正,我使用asylum2010()的优秀演示作为参考 现在看:这是对上述演示中的着色器的改编: #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

我试图在我自己的图形引擎中实现色调映射校正,我使用asylum2010()的优秀演示作为参考 现在看:这是对上述演示中的着色器的改编:

#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);
}
#版本150
均匀采样器2D采样器0;
均匀vec2纹理;
统一水平;
vec2tex;
out vec4 my_FragColor0;
void main()
{
const vec3亮度_VECTOR=vec3(0.2125,0.7154,0.0721);
vec4样本=纹理(sampler0,tex+vec2(-0.5,-0.5)*texelSize);
float dt=点(sample.rgb,亮度向量);
if(sample.r>0.99&&sample.g>0.99&&sample.b>0.99)
{
如果(dt>0.9998)
{
if(log(0.0001+dt)<1.0)//0.99&&sample.g>0.99&&sample.b>0.99)
{
如果(dt>0.9998)
{
如果(对数(0.0001+dt)<1.0)//0.99),则表示对数计算的结果大于1.0

当我运行自己的着色器时(当然是通过相同的样本和相同的纹理大小),它会输出暗红色,这意味着日志结果低于1.0


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

对于感兴趣的人,我终于找到了问题所在。 错误实际上是点积。我作为ColorMap传递了一个内部格式为GL_RGBA的纹理,而它应该是浮点纹理,以便存储大于1的值。
我还想知道我收到否决票的原因。知道原因将有助于我避免在发布问题时可能犯的任何错误。

不确定您是否能看到您的问题的接近票,即:“问题需要包含重现问题所需的最短代码”正如您已经在问题本身中得出的结论“代码完全相同”,因此问题显然不是着色器源,因此您的问题不允许给出实质性的答案,因为我们所能做的一切就是猜测您在“黑盒”代码中可能做错了什么。@LJᛃ 谢谢你的解释。从现在开始我会努力改进我的问题
#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);
}