查看2010年的这个问题,涉及到现代OpenGL中的顶点缓冲区,是否仍然不支持直接状态访问(Direct State Access)?我已经修改了大部分图形库,使用DSA与帧缓冲、纹理等,但我仍然需要"bind"来设置我的顶点数组状态(绑定数组、绑定索引缓冲区、绑定顶点缓冲区、解除绑定数组等)。
更新1: 我无法理解BDL答案中参数的作用。我的一个非常简单的顶点缓冲区单元测试(一个属性,一个位置)给我一个空屏幕(旧方法描述顶点流时它能正常工作)。它应该只画一个三角形,不需要使用索引缓冲区。
这是我正在做的事情,注释是我的理解:
现在,我对绑定点有了一定的理解。它们是我可以分配的任意数字,这样我就可以快速轻松地切换不同的属性集。因此,在这个简单的测试中,只使用0应该就足够了。
我使用glCreateBuffers创建vbo和glCreateVertexArrays创建vao(与之前的可绑定样式不同)。没有调试输出(调试上下文已开启),每个调用都经过了glGetError检查,没有报告错误。
更新2:glVertexArrayVertexBuffer的步长和偏移顺序颠倒了。现在它可以工作了。
更新3:glVertexArrayVertexBuffer仅被调用一次,而不是针对VBO中的每个属性(如果您有交错的位置、纹理等)。
这是我正在做的事情,注释是我的理解:
::glEnableVertexArrayAttrib(vao, // VAO name.
0); // Attribute index (layout in shader).
::glVertexArrayVertexBuffer(vao, // VAO name.
0, // Binding point.
vbo, // VBO name.
12, // Stride (bytes).
0); // Offset (bytes).
::glVertexArrayAttribFormat(vao, // VAO name.
0, // Attribute index (layout in shader).
3, // Component count (x,y,z).
GL_FLOAT, // Type.
GL_FALSE, // Normalised.
0); // Offset (bytes).
::glVertexArrayAttribBinding(vao, // VAO name.
0, // Attribute index (layout in shader).
0); // Binding point.
现在,我对绑定点有了一定的理解。它们是我可以分配的任意数字,这样我就可以快速轻松地切换不同的属性集。因此,在这个简单的测试中,只使用0应该就足够了。
我使用glCreateBuffers创建vbo和glCreateVertexArrays创建vao(与之前的可绑定样式不同)。没有调试输出(调试上下文已开启),每个调用都经过了glGetError检查,没有报告错误。
更新2:glVertexArrayVertexBuffer的步长和偏移顺序颠倒了。现在它可以工作了。
更新3:glVertexArrayVertexBuffer仅被调用一次,而不是针对VBO中的每个属性(如果您有交错的位置、纹理等)。
glVertexArrayVertexBuffer
中,步长和偏移量的顺序是错误的(首先是偏移量,然后是步长才是正确的)。 - BDL