#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/
На втором проходе эти отладочные текстуры затем могут быть использованы для рисования квадрата, накладывающегося на реальную сцену. Этот метод часто используется для визуализации и отладки буфера глубины или нормалей поверхности.