Я пытаюсь внедрить коррекцию тоннама в моем собственном графическом движке, и я использую в качестве ссылки отличную демонстрацию от 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 ᛃ Спасибо за объяснение. Я постараюсь улучшить свои вопросы сейчас –