Я пытаюсь передать атрибуты моему вершинному шейдеру, но по какой-то причине он продолжает давать мне -1 в третьем местоположении атрибута. Я прошу openGl получить через glGetAttribLocation (). В настоящее время он продолжает давать мне -1 для атрибута texCoord, и если я переключаю texAttrib и colAttrib (переключая строки в коде), он дает мне -1 для свойства цвета вместо текстуры, и я понятия не имею, почему? Поскольку -1 передается в glVertexAttribPointer, я получаю ошибку 1281 OpenGL: GL_INVALID_VALUE.
Мой вершинный шейдер:
#version 150
in vec3 position;
in vec3 color;
in vec2 texcoord;
out vec3 Color;
out vec2 Texcoord;
void main()
{
Color = color;
Texcoord = texcoord;
gl_Position = vec4(position.x, position.y, position.z, 1.0);
}
Код OpenGL:
basicShader.Use();
// Buffers and shaders
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vbo);
// Make it active vbo
glBindBuffer(GL_ARRAY_BUFFER, vbo);
// Build basic triangle
float vertices[] = {
// position // color // textures
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right
-0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f// Bottom-left
};
GLuint elements[] = {
0, 1, 2,
2, 3, 0
};
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
GLint posAttrib = glGetAttribLocation(basicShader.shaderProgram, "position");
glEnableVertexAttribArray(posAttrib); // Enable attribute first before specifiying attributes
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), 0); // 6 float sizes is every new vertex
GLint colAttrib = glGetAttribLocation(basicShader.shaderProgram, "color");
glEnableVertexAttribArray(colAttrib);
glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); // same for color + offset
GLint texAttrib = glGetAttribLocation(basicShader.shaderProgram, "texcoord"); // Returns -1
glEnableVertexAttribArray(texAttrib);
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); // 6 offset from beginning
[..]
Вы должны прекратить использование glGetAttribLocation
, приписывать каждый атрибут место, либо с glBindAttribLocation
перед связыванием программы или с явным расположением атрибутов, если это доступно вам.
Таким образом, если компилятор оптимизирует атрибут (что и происходит здесь; ваш фрагментный шейдер, вероятно, не использует одно из интерполированных значений), вам будет все равно. Вы настроите свои массивы как обычно, используя стандартное соглашение для индексов атрибутов. Кроме того, вам не придется постоянно спрашивать, каково расположение атрибутов каждый раз, когда вы хотите визуализировать с помощью другой программы; вы знать какое это место, потому что вы его назначили.
Если ты не можешь / не будешь, тогда ты ничего не сможешь сделать. Компилятор оптимизирует удаленные атрибуты, если вы на самом деле их не используете. Единственное, что вы можете сделать, это обнаружить, что он возвращает -1, и не устанавливать массив для этого атрибута.
Других решений пока нет …