Неиспользуемые переменные в шейдерах фрагментов изменяют результат рендеринга

#opengl #glsl

#opengl #glsl

Вопрос:

Вот мой фрагментный шейдер:

 #version 430 core 
uniform vec4 Ambient;
uniform vec3 LightColor;
uniform vec3 LightDirection;
uniform vec3 HalfVector;
uniform float Shininess;
uniform float Strength;
in vec4 color;
in vec3 Normal;

out vec4 FragColor;
out vec3 directfeed;
out vec3 normalfeed;

void main()
{
    float diffuse = max(0.0f, dot(Normal, LightDirection));
    normalfeed = Normal;
    directfeed = LightDirection;
    float specular = max(0.0f, dot(Normal, HalfVector));
    if(diffuse <= 0.00001)
        specular = 0.0f;
    else
        specular = pow(specular, Shininess);
    vec4 ReflectLight = vec4(LightColor*specular*Strength, 0.0);
    FragColor = min(color*Ambient ReflectLight, vec4(1.0));
}
 

если я удалю эти две строки normalfeed = Normal; и directfeed = LightDirection; , результат будет другим, но эти два параметра normalfeed и directfeed вообще не работают, почему? И если я попытаюсь вывести две переменные в буфер обратной связи, я сделаю это так:

 char* oVerts[] = { "normalfeed" ,"gl_NextBuffer","directfeed" };
glTransformFeedbackVaryings(Program, 3, oVerts, GL_INTERLEAVED_ATTRIBS);
 

после Program повторной ссылки ничего не выходит.

Ответ №1:

Вы не можете использовать обратную связь преобразования в шейдере фрагментов. Разрешены только вершинные или геометрические шейдеры. Документацию по этому вопросу см.:

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTransformFeedbackVaryings.xhtml

Чего вы ожидаете от переменных normalfeed и directfeed ? Вы хотите, чтобы они генерировали некоторый вывод в фреймбуфере? Затем вам нужно включить вывод для более чем одного цветного вложения. Для настройки этого я бы рекомендовал прочитать документацию по следующим функциям:

 glDrawBuffers
glBindFramebuffer
glBindRenderbuffer
glRenderbufferStorage
glFramebufferRenderbuffer
 

Если переменные, которые вы объявили, предназначены для отладки, может быть интересно преобразовать их в текстуру:

http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/

На втором проходе эти отладочные текстуры затем могут быть использованы для рисования квадрата, накладывающегося на реальную сцену. Этот метод часто используется для визуализации и отладки буфера глубины или нормалей поверхности.