2014-10-21 2 views
-1

У меня есть инициализатор баребон, в котором я создаю программу 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 
+2

Я начал бы с проверки состояния ошибки конечного автомата после каждой операции. что-то вроде: 'if (glGetError()! = GL_NO_ERROR) {fprint (stderr,« Ошибка в строке% d \ n », __ LINE __);}' – Steffen

+0

Вы проверяете compileError и linkError? – BDL

+4

-1 означает, что компилятор решил, что атрибут не используется или компиляция программы не удалась, вы также никогда не проверяете флаги 'compileError' или' linkError' –

ответ

0

Благодарности к комментарию @derhass отвечал, я нашел этот вопрос. Я неправильно прочитал возвращаемое значение моего состояния компиляции шейдеров. Оказывается, они не компилируются, и в результате компилятор не смог найти мой именованный атрибут.

Проблема с моим кодом шейдера была дополнительной ; после блока main.

const char *vsSource = 
    "#version 120\n" 
    "attribute vec2 coord2d;\n" 
    "void main(void) {\n" 
    " gl_Position = vec4(coord2d, 0.0, 1.0);\n" 
    "};"; // <- this is the problem 

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

Это окончательная рабочая версия для одного из двух шейдеров.

const char *vsSource = 
    "#version 120\n" 
    "attribute vec2 coord2d;\n" 
    "void main(void) {\n" 
    " gl_Position = vec4(coord2d, 0.0, 1.0);\n" 
    "}"; 
Смежные вопросы