GLSL 1.5 и OpenGL 3.3: кажется, что передача цвета вершинному шейдеру не удалась - PullRequest
4 голосов
/ 07 декабря 2010

У меня проблема при передаче атрибутов вершин в работающую шейдерную программу.Я хотел бы передать два атрибута, положение и цвет RGBA.Привязка местоположения атрибута работает для позиции.Тем не менее, это не работает для цвета.Поэтому вся геометрия в конечном итоге становится черной.

Вот что я делаю:

GLuint programHandler;

// create program
// compile & attach vertex shader
// compile & attach fragment shader

glBindAttribLocation(programHandler, 0, "InPosition");
glBindAttribLocation(programHandler, 1, "InColor");
glBindFragDataLocation(programHandler, 1, "FragColor");

glLinkProgram(programHandler);
glUseProgram(programHandler);

// initialize uniform variables

// I'm trying to get the attribute locations now.
// I expect location "0" for InPosition and location "1" for InColor.
// In fact, it gets me a "-1" for InColor. I simply cannot see the reason for that behaviour

GLint positionLocation = glGetAttribLocation(programHandler, "InPosition"); // returns 0
GLint colorLocation = glGetAttribLocation(programHandler, "InColor"); // returns -1

glEnableVertexAttribArray(positionLocation);
glEnableVertexAttribArray(colorLocation); // fails!

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

#version 150 core

// input
uniform mat4 ModelviewMatrix;
uniform mat4 ProjectionMatrix;
in vec3 InPosition;
in vec4 InColor;

// output
out vec4 PassColor;

void main(void) {
    // passing color through to fragment shader
    PassColor = InColor;

    // transformation
    gl_Position = ProjectionMatrix * ModelviewMatrix * vec4(InPosition, 1.0);
}

Мой фрагментный шейдер должен просто вернуть этот цвет:

#version 150 core
precision highp float;

// input
in vec4 PassColor;

// output
out vec4 FragColor;

void main(void) {
    FragColor = PassColor;
}

Почему работает привязка "InPosition"а "InColor" нет?Мне известно, что компилятор GLSL оптимизирует код шейдера, поэтому неиспользуемые переменные не могут быть связаны.Но я не понимаю, почему цвет должен быть оптимизирован здесь.В конце концов, я использую его, передавая его фрагментному шейдеру.

1 Ответ

1 голос
/ 07 декабря 2010

Слепой выстрел, я считаю, что это неправильно:

glBindFragDataLocation(programHandler, 1, "FragColor");

Это должно быть:

glBindFragDataLocation(programHandler, 0, "FragColor");
...