从 2010 年的这个问题来看,关于现代 OpenGL 中的顶点缓冲区,是否仍然存在直接状态访问不可用的情况?我已经修改了我的大部分图形库以使用带有帧缓冲区、纹理等的 DSA,但我仍然需要“绑定”来设置我的顶点数组状态(绑定数组、绑定索引缓冲区、绑定顶点缓冲区、取消绑定数组等)。 )。
更新 1: 我无法从 BDL 的回答中理解参数的作用。我对一个非常简单的顶点缓冲区(一个属性,一个位置)的单元测试给了我一个空白屏幕(它适用于描述顶点流的旧方法)。它应该只绘制一个三角形,不需要索引缓冲区。
这是我正在做的事情,评论是我的理解:
::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 中的每个属性调用一次(如果你有交错的位置、纹理等)。