OpenGL:是否需要启用所有顶点属性?

时间:2013-12-18 14:05:53

标签: opengl attributes vertex

我阅读了本教程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而不是相反。顺便说一句,启用/禁用顶点属性的用处是什么?我的意思是你(至少我)可能会最终启用所有顶点属性,以便它们默认为关闭的原因?

1 个答案:

答案 0 :(得分:2)

glDrawArrays调用时,读取当前启用的属性并将其传递给渲染器。如果在此之前禁用它们,那么它们将不会从缓冲区传递。

可以提供许多潜在的属性(最多glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &result);至少16个),大多数应用程序不需要那么多。

着色器中的position属性设置为索引0,如果未分配,则着色器将获取具有相同位置的所有点(通常为0,0,0,1) 。索引1是颜色数据,如果缺少,则不是什么大问题。