glGetAttribLocation возвращает -1 при получении существующего атрибута шейдера

Я пытаюсь передать атрибуты моему вершинному шейдеру, но по какой-то причине он продолжает давать мне -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

[..]

8

Решение

Вы должны прекратить использование glGetAttribLocation, приписывать каждый атрибут место, либо с glBindAttribLocation перед связыванием программы или с явным расположением атрибутов, если это доступно вам.

Таким образом, если компилятор оптимизирует атрибут (что и происходит здесь; ваш фрагментный шейдер, вероятно, не использует одно из интерполированных значений), вам будет все равно. Вы настроите свои массивы как обычно, используя стандартное соглашение для индексов атрибутов. Кроме того, вам не придется постоянно спрашивать, каково расположение атрибутов каждый раз, когда вы хотите визуализировать с помощью другой программы; вы знать какое это место, потому что вы его назначили.

Если ты не можешь / не будешь, тогда ты ничего не сможешь сделать. Компилятор оптимизирует удаленные атрибуты, если вы на самом деле их не используете. Единственное, что вы можете сделать, это обнаружить, что он возвращает -1, и не устанавливать массив для этого атрибута.

22

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]