Передача переменных из геометрического шейдера в фрагментный шейдер

#opengl #glsl #geometry-shader

#opengl #glsl #геометрия-шейдер

Вопрос:

У меня есть геометрический шейдер GLSL, который выглядит следующим образом:

 #version 150

uniform mat4 p;
uniform mat4 mv;
uniform mat3 nm;

layout(points) in;
layout(triangle_strip, max_vertices = 200) out;

out vec4 test;

void main() {
    for (int i = 0; i < gl_in.length(); i  ) {
        ....        
        gl_Position = p * mv * gl_in[i].gl_Position;
        test = vec4(1.0, 0.0, 0.0, 0.0);
        EmitVertex();       
        ....        
        EndPrimitive();
    }
}
  

Однако, когда я пытаюсь получить доступ к «test» в моем фрагментном шейдере, происходит сбой моего приложения. Вот мой фрагментный шейдер:

 #version 150

out vec4 fColor;
in vec4 test;

void main(void) {
    fColor = vec4(test.x, 1.0, 0.4, 0);
}
  

Кто-нибудь может мне помочь передать переменную из геометрии в фрагментный шейдер? varying не рекомендуется в #version 150 .

Комментарии:

1. Вы уверены, что он вылетает из-за вашего фрагментного шейдера?

2. То, что вы делаете, звучит нормально. Где именно происходит сбой?

3. Я использую JOGL2, потому что я пишу это приложение на Java. Если шейдер выглядит правильным для вас, это действительно очень помогает мне, потому что тогда ошибка может быть где-то в другом месте. Я даже не получаю ответа от графического процессора, поэтому я думаю, что это может быть ошибкой в привязках Java OpenGL… В настоящее время я не знаю, какую часть кода мне следует опубликовать, потому что я не уверен, помогает это или нет… Я обновлю свой пост, если узнаю больше. Спасибо за помощь.

4.Попробуйте закомментировать test и записать fColor = vec4(1.0); . Если это работает, test может быть проблема, в противном случае вы можете исключить это.

Ответ №1:

Вам нужно объявить test в качестве входных данных в вашем фрагментном шейдере (интересно, почему шейдер компилируется):

 in vec4 test;
  

Комментарии:

1. Ах, извините, это была опечатка, которая произошла, когда я урезал код для Stackoverflow :). Однако один голос за вас.