2014-10-15 2 views
1

Я запрограммировал приложение OpenGL с окном SDL. Основной профиль работает с OpenGL 4.1 на Mac OSX 10.9. Команда glClearColor отлично работает, и я получаю правильный цвет на экране. Но внутри моего рендеринга я получил ошибку GL_INVALID_OPERATION каждый раз, когда выполняю команды glEnableVertexAttribArray и glDrawArrays.OSX OpenGL 4.1 glEnableVertexAttribArray glDrawArrays GL_INVALID_OPERATION

Вот код:

Vertex Shader:

#version 410 

in vec4 position; 

void main(void) 
{ 
    gl_Position = position; 
} 

Фрагмент Shader:

#version 410 

out vec4 out_Color; 

void main(void) 
{ 
    out_Color = vec4(0.0, 1.0, 0.0, 1.0); 
} 

Все шейдер компилировать и связан с программой. Ошибка связывания!

Создание буфера с данными:

static const float VertexBufferData[] = { 
      0.75f, 0.75f, 0.0f, 1.0f, 
      0.75f, -0.75f, 0.0f, 1.0f, 
      -0.75f, -0.75f, 0.0f, 1.0f, 
}; 

glGenBuffers(1, &m_VertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(VertexBufferData), VertexBufferData, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

Рендер:

glUseProgram(m_ShaderProgram); 

glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); 

glEnableVertexAttribArray(0); 

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 

glDrawArrays(GL_TRIANGLES, 0, 3); 

// glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr); 

glDisableVertexAttribArray(0); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

glUseProgram(0); 

Выход:

Output of my application with profiler description

+2

Насколько я знаю, рисунок без активного VAO не допускается в Основной профиль. Попробуйте создать vao и привязать его до glBindBuffer. – BDL

+0

Хорошо. Это была проблема. Немного странно, на мой взгляд. Зачем мне ВАО ... Я должен снова прочитать основы. :-) –

+0

Если вы явно не создаете и не привязаете VAO, вы просто будете использовать VAO по умолчанию (0). Использование любого типа объектов по умолчанию больше не разрешается в основном профиле. Из спецификации в разделе «Устаревшие и удаленные функции»: «Объект вершинного массива по умолчанию (имя ноль) также устарел.« –

ответ

1

AS BDL уже сказал: решение заключается в создании VAO. В качестве краткого описания: VAO (Vertex Array Object) представляет собой набор VBOs, который описывает вершинную компоновку и вершины для шейдера.

Больше информации здесь:

Так я изменил следующие блоки кода:

Буфер:

static const float VertexBufferData[] = { 
      0.75f, 0.75f, 0.0f, 1.0f, 
      0.75f, -0.75f, 0.0f, 1.0f, 
      -0.75f, -0.75f, 0.0f, 1.0f, 
     }; 

    glGenVertexArrays(1, &m_VertexBufferArray); 
    glBindVertexArray(m_VertexBufferArray); 

    glGenBuffers(1, &m_VertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(VertexBufferData), VertexBufferData, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(0); 

    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 

    glBindVertexArray(0); 

Рендер:

glUseProgram(m_ShaderProgram); 

    glBindVertexArray(m_VertexBufferArray); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glBindVertexArray(0); 

    glUseProgram(0); 

Результат:

Final working result.

Смежные вопросы