2016-12-16 3 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. Также мне хотелось бы узнать причину полученного ниже нисходящего потока. Знание причины поможет мне избежать любой ошибки, которую я, возможно, сделал, разместив вопрос.

+1

Не уверен, что вы можете видеть близкие голоса по вашему вопросу, которые: * «вопрос должен содержать кратчайший код, необходимый для воспроизведения проблемы» *, как вы уже заключили в самом вопросе * «код точно так же "*, поэтому его явная проблема заключается не в * источнике шейдеров, поэтому ваш вопрос не позволяет получить существенный ответ, поскольку все, что мы можем сделать, это угадать, что вы можете делать неправильно в своем« черном »коде. –

+0

@ LJ ᛃ Спасибо за объяснение. Я постараюсь улучшить свои вопросы сейчас –