GLSL 1.5 Simple Geometry shader - PullRequest
       102

GLSL 1.5 Simple Geometry shader

6 голосов
/ 10 января 2012

Я пытаюсь написать простой геометрический шейдер, который просто проходит через вершины, прежде чем пытаться что-то модифицировать.

Мой вершинный шейдер

#version 150 core
in vec3 inPosition;
in vec4 inColor;

out vec4 vertexColor;

void main() {
    vertexColor = inColor;
    gl_Position = vec4(inPosition, 1.0);
}

Мой геометрический шейдер

#version 150 core
layout (triangles) in;
layout (triangle_strip,  max_vertices=3) out;

void main() {
    gl_Position = gl_in[0].gl_Position;
    EmitVertex();

    gl_Position = gl_in[1].gl_Position;
    EmitVertex();

    gl_Position = gl_in[2].gl_Position;
    EmitVertex();
    EndPrimitive();
}

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

#version 150 core
in vec4 vertexColor;
out vec4 fragColor;

void main() {
    fragColor = vertexColor;
}

Без привязанного геометрического шейдера все работает отлично.Однако, когда я связываю геометрический шейдер, он перестает работать.Чего мне не хватает?Требуется ли от моего вершинного шейдера мой геометрический шейдер для vertexColor, и если да, то как это сделать?

1 Ответ

7 голосов
/ 13 января 2012

Мой геометрический шейдер точно такой же, как тот, что указан на этой странице

Да, но ваши бесплатные вершинные и фрагментные шейдеры не .

Информация проходит через конвейер OpenGL следующим образом: во-первых, вершинный шейдер получает данные. Он передает свои выходные данные в геометрический шейдер, если он присутствует. Геометрический шейдер передает свои выходные данные фрагментному шейдеру (конечно, после обычного растеризации треугольника). И фрагментный шейдер передает свои выходные данные на стадию смешивания.

Ваш вершинный шейдер имеет два выхода: gl_Position и vertexColor. Однако ваш геометрический шейдер принимает только один ввод: gl_in[0].gl_Position. Это недопустимо в GLSL: если один этап выводит значение, следующий этап должен ввести его. Единственными исключениями являются значения, определенные GLSL, такие как gl_Position, который используется растеризатором.

Ваш транзитный GS должен на самом деле передавать данные через , если вы хотите, чтобы они были сквозными. Вам нужно правильно ввести данные в GS:

in vec4 vertexColor[];

Однако глобальные переменные в GLSL нельзя называть одинаковыми. Таким образом, вы не можете взять vertexColor в качестве входа и в качестве выхода. Поэтому вместо этого вы должны изменить имя вывода (или использовать интерфейсные блоки ):

out vec4 gsColor;

Ваш фрагментный шейдер должен теперь взять in vec4 gsColor; и работать с этим.

Когда вы пытались связать эти шейдеры, ваш компилятор должен был предоставить вам соответствующий информационный журнал, объясняющий несоответствие. Получаете ли вы ваши информационные журналы, когда ваши шейдеры не связываются? Если нет, вам следует.

...