Переписать старый OpenGL в OpenGL 4.5 с DSA? - PullRequest
2 голосов
/ 22 апреля 2019

Я пытался переписать следующий код много раз, но потерпел неудачу, я знаю, что должен использовать такие функции, как glCreateBuffers, glVertexArrayElementBuffer, glVertexArrayVertexBuffer, glnamedBufferData, glBindVertexArray, но у меня есть проблема с разделом, в котором заменены glBindttBerteberTerBuinteBuffer и GLBindTerBuffer.1001 *

Это следующий код, который я пытался реализовать:

glCreateBuffers(1, &phong.vbo);  
glNamedBufferData(phong.vbo,sizeof(modelVertices),modelVertices,GL_STATIC_DRAW);
glCreateBuffers(1, &phong.ebo);  glNamedBufferData(phong.ebo,sizeof(modelIndices),modelIndices,GL_STATIC_DRAW); 
glCreateVertexArrays(1, &phong.vao);
glBindVertexArray(phong.vao); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, phong.ebo);   
glBindBuffer(GL_ARRAY_BUFFER, phong.vbo);
const GLint possitionAttribute = glGetAttribLocation(phong.program, "position");
glVertexAttribPointer((GLuint) possitionAttribute, 3, GL_FLOAT, GL_FALSE,
sizeof(GLfloat) * 6, (const GLvoid *) 0 );
glEnableVertexAttribArray((GLuint) possitionAttribute);

1 Ответ

2 голосов
/ 22 апреля 2019

Вы не «заменяете» glBindBuffer; Вы просто не используете это. В этом весь смысл DSA: не нужно связывать объекты просто для изменения их.

glGetAttribLocation уже является функцией DSA (первым параметром является объект, на который она действует), поэтому вы продолжаете использовать его (или, что еще лучше, прекратите задавать шейдер и назначить position конкретное местоположение в шейдер ).

Все функции glVertexArray* управляют VAO, прикрепляя буферы и определяя форматы вершин. Проблема, с которой вы столкнулись, заключается в том, что вы привыкли к ужасному glVertexAttribPointer API, который был заменен на гораздо лучший API в 4.3 . А DSA не предоставляет DSA-версию ужасного старого API. Поэтому вам нужно использовать отдельный API формата атрибута в форме DSA.

Эквивалентом того, что вы пытаетесь сделать, будет:

glCreateVertexArrays(1, &phong.vao);

//Setup vertex format.
auto positionAttribute = glGetAttribLocation(phong.program, "position");
glEnableVertexArrayAttrib(phong.vao, positionAttribute);
glVertexArrayAttribFormat(phong.vao, positionAttribute, 3, GL_FLOAT, GL_FALSE, 0);
glVertexArrayAttribBinding(phong.vao, positionAttribute, 0);

//Attach a buffer to be read from.
//0 is the *binding index*, not the attribute index.
glVertexArrayVertexBuffer(phong.vao, 0, phong.vbo, 0, sizeof(GLfloat) * 6);

//Index buffer
glVertexArrayElementBuffer(phong.vao, phong.ebo);
...