我阅读了本教程arc synthesis, vertex attributes, chapter 2 playing with colors并决定使用代码。总而言之,本教程将介绍如何将顶点颜色和坐标传递给顶点和片段着色器,以便在三角形上添加一些颜色。
以下是显示功能的代码(来自教程的一些更改),按预期工作:
void display()
{
// cleaning screen
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
//using expected program and binding to expected buffer
glUseProgram(theProgram);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
//setting data to attrib 0
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
//glDisableVertexAttribArray(0); // if uncommenting this out, it does not work anymore
//setting data to attrib 1
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)48);
//cleaning and rendering
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glUseProgram(0);
glfwSwapBuffers();
}
现在如果取消注释该行 // glDisableVertexAttribArray(0); 在将数据设置为属性1之前,这不再起作用。这是为什么 ?另外,我不明白为什么在没有启用1的情况下可以设置属性0而不是相反。顺便说一句,启用/禁用顶点属性的用处是什么?我的意思是你(至少我)可能会最终启用所有顶点属性,以便它们默认为关闭的原因?
答案 0 :(得分:2)
在glDrawArrays
调用时,读取当前启用的属性并将其传递给渲染器。如果在此之前禁用它们,那么它们将不会从缓冲区传递。
可以提供许多潜在的属性(最多glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &result);
至少16个),大多数应用程序不需要那么多。
着色器中的position
属性设置为索引0
,如果未分配,则着色器将获取具有相同位置的所有点(通常为0,0,0,1) 。索引1是颜色数据,如果缺少,则不是什么大问题。