glDrawElements успешен, однако glDrawElementsInstance завершается ошибкой с GL_INVALID_OPERATION - PullRequest
0 голосов
/ 10 мая 2018

Я нахожусь в процессе миграции графического 3D-движка нашего настольного приложения из профиля совместимости в профиль ядра. Поскольку требуется много кода, я меняю рендеры по одному на профиле совместимости, и когда все они будут конвертированы, я планирую переключить профиль на ядро.

Для этого я пишу небольшие тесты рендеринга, чтобы убедиться, что я понимаю, как использовать расширенные функции OpenGL 4.3 поверх профиля совместимости.

Я написал следующий код инициализации:

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

glGenBuffers (1, &_vertexBufferObjectID);
glGenBuffers (1, &_indexBufferObjectID);
glGenBuffers (1, &_instanceBufferID);

glBindBuffer (GL_ARRAY_BUFFER, _vertexBufferObjectID);
glBufferData (GL_ARRAY_BUFFER, sizeof (Verts), Verts, GL_STATIC_DRAW);

glVertexAttribPointer ((GLuint) 0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray (0);

glBindBuffer (GL_ARRAY_BUFFER, _instanceBufferID);
glBufferData (GL_ARRAY_BUFFER, sizeof (Centers), Centers, GL_STATIC_DRAW);

glVertexAttribPointer ((GLuint) 1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray (1);
glVertexAttribDivisor (1, 1);

glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, _indexBufferObjectID);
glBufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (Faces), Faces, GL_STATIC_DRAW);

// creates the shader objects and program and links it in the current VAO scope
generateShaderProgram (); 

glBindVertexArray (0);

Моя функция рендеринга:

glBindVertexArray (_vertexArrayObjectID);

// Load the shader into the rendering pipeline 
glUseProgram (_program);

// Render the scene:
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glDrawElements (GL_LINE_LOOP, _indexCount, GL_UNSIGNED_INT, 0);

// Cleanup all the things we bound 
glUseProgram (0);
glBindVertexArray (0);

Этот код работает без ошибок. Однако, когда я изменяю линию рисования (не меняя ничего больше) на:

glDrawElementsInstanced (GL_LINE_LOOP, _indexCount, GL_UNSIGNED_INT, 0, 4);

Я получаю ошибку GL_INVALID_OPERATION (1282) сразу после вышеприведенной команды.

Моя шейдерная программа:

// vertex shader
#version 400                        
in layout(location=0) vec3 Position; 
in layout(location=1) vec3 Center; 
out vec3 theColor;                  
void main () {                      
    vec4 v = vec4(Position, 1.0);   
    vec4 offset = vec4(Center, 1.0);    
    mat4 transform = mat4(vec4(0.1,0.0,0.0,0.0),vec4(0.0,0.1,0.0,0.0),vec4(0.0,0.0,0.1,0.0),offset); "
    gl_Position = transform * v;   
    theColor = Position;            
}

//fragment shader
#version 400                            
in vec3 theColor;                       
out vec4 fragColor;                     
void main () {                          
    fragColor = vec4(theColor, 1.0);    
}

Я неправильно использую экземпляр для рендеринга?

1 Ответ

0 голосов
/ 10 мая 2018

Проблема исправлена!

Этот код работает в режиме совместимости, поэтому доступ к экземпляру draw осуществляется через расширение. Кажется, что в моем дереве сцены (поверх которого я запускал тест) есть некоторая поддержка для кэширования через список отображения. Похоже, что элементы draw правильно работают со списком отображения, однако экземпляр draw не работает.

цитата из: https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_draw_instanced.txt

Дополнения к главе 5 спецификации OpenGL 2.1 (Специальные функции)

Ошибка INVALID_OPERATION генерируется, если DrawArraysInstancedARB или DrawElementsInstancedARB вызывается во время отображения списка сборник.

Ошибка была устранена, когда я отследил создание списка отображения и удалил его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...