У меня есть инициализатор баребон, в котором я создаю программу OpenGL и прикрепляю к ней пару шейдеров. Все работает до такой степени, что я пытаюсь создать атрибут. Проще говоря - glGetAttribLocation
возвращает -1
.glGetAttribLocation возвращает -1, почему?
В Интернете мало что можно прочитать о возможной причине для этого значения.
// Window.h
GLuint glutProgram;
GLint glutCoordinateAttribute;
// Window.cpp
window.glutProgram = glCreateProgram();
// Shaders
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
// Vertex shader
const char *vsSource =
"#version 120\n"
"attribute vec2 coord2d;\n"
"void main(void) {\n"
" gl_Position = vec4(coord2d, 0.0, 1.0);\n"
"};";
// Fragment shader
const char *fsSource =
"#version 120\n"
"void main(void) {\n"
" gl_FragColor[0] = 0.2;\n"
" gl_FragColor[1] = 0.2;\n"
" gl_FragColor[2] = 0.2;\n"
"};";
glShaderSource(vs, 1, &vsSource, NULL);
glShaderSource(fs, 1, &fsSource, NULL);
glCompileShader(vs);
glCompileShader(fs);
GLint compileError = GL_FALSE;
glGetShaderiv(vs, GL_COMPILE_STATUS, &compileError);
glGetShaderiv(fs, GL_COMPILE_STATUS, &compileError);
// Link resources
glAttachShader(window.glutProgram, vs);
glAttachShader(window.glutProgram, fs);
glLinkProgram(window.glutProgram);
glGetProgramiv(window.glutProgram, GL_LINK_STATUS, &linkError);
glGetProgramiv(window.glutProgram, GL_ATTACHED_SHADERS, &linkError);
const char *name = "coord2d";
std::cout << "window.glutCoordinateAttribute: " << window.glutCoordinateAttribute << std::endl;
window.glutCoordinateAttribute = glGetAttribLocation(window.glutProgram, name);
std::cout << "window.glutCoordinateAttribute: " << window.glutCoordinateAttribute << std::endl;
Следующие программы при выполнении напечатает:
window.glutCoordinateAttribute: 0
window.glutCoordinateAttribute: -1
Я начал бы с проверки состояния ошибки конечного автомата после каждой операции. что-то вроде: 'if (glGetError()! = GL_NO_ERROR) {fprint (stderr,« Ошибка в строке% d \ n », __ LINE __);}' – Steffen
Вы проверяете compileError и linkError? – BDL
-1 означает, что компилятор решил, что атрибут не используется или компиляция программы не удалась, вы также никогда не проверяете флаги 'compileError' или' linkError' –