我多次尝试重写以下代码,但失败了,我知道我必须使用glCreateBuffers,glVertexArrayElementBuffer,glVertexArrayVertexBuffer,glnamedBufferData,glBindVertexArray之类的函数,但是我在替换glBindBuffer,glVertexAttribPointer,glEnableVertexAttribArray和glGetAttribLocation时遇到问题。
这是我尝试实现的以下代码:
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);
你不会"替换"glBindBuffer
;你只是不使用它。这就像DSA的全部意义:不必仅仅为了修改对象而绑定对象。
glGetAttribLocation
已经是一个 DSA 函数(第一个参数是它作用的对象(,因此您继续使用它(或者更好的是,停止询问着色器并在着色器中position
分配特定位置(。
glVertexArray*
函数都操作 VAO、附加缓冲区和定义顶点格式。你遇到的"问题"是你习惯了糟糕的glVertexAttribPointer
API,它在 4.3 中被一个更好的 API 所取代。DSA不提供糟糕的旧API的DSA版本。因此,您需要使用单独的属性格式 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);