Kim*_*imi 9 opengl vertex-buffer
我很难理解VAO究竟是如何处理缓冲区映射的.我正在做的可以在这个伪代码中描述:
SetUp:
BindVAO
BindArrayBuffer
glBufferData(GL_ARRAY_BUFFER, ExpectedMaxCount, NULL, GL_DYNAMIC_DRAW);//Allocate storage
glEnableVertexAttribArray
glVertexAttribPointer
BindElementBuffer
Allocate storage (no data yet)
UnbindVAO
UnbindArrayBuffer
UnbindElementBuffer
Draw:
SubArrayAndElementDataIfNeeded
BindVAO
DrawElements
Run Code Online (Sandbox Code Playgroud)
这是正确的,当调用DrawElements时,OpenGL使用绑定的VAO来解析数组和元素缓冲区绑定吗?在Draw调用之后,绑定数组缓冲区为0,但元素缓冲区仍然是用于绘制的缓冲区.
在VAO设置期间是否必须分配缓冲存储器?如果在安装后调用BufferData,VAO会失效吗?
Nic*_*las 13
我很难理解VAO究竟是如何处理缓冲区映射的.
在"缓冲区"周围使用"映射"一词时要非常小心; 在处理缓冲区对象时具有特定含义,这可能是您不想要的.
这是正确的,当调用DrawElements时,OpenGL使用绑定的VAO来解析数组和元素缓冲区绑定吗?在Draw调用之后,绑定数组缓冲区为0,但元素缓冲区仍然是用于绘制的缓冲区.
一个与另一个无关.甲顶点数组对象,顾名思义,包含所有这需要从阵列拉顶点数据的状态的.当你绑定一个时,所有状态都会回到上下文中.
调用后"绑定数组缓冲区"为0的原因是因为它在调用之前为0 .绘制调用不会更改OpenGL状态.
此外,你似乎已陷入GL_ARRAY_BUFFER陷阱.该GL_ARRAY_BUFFER只事项三种功能结合:glVertexAttribPointer,glVertexAttribIPointer,和glVertexAttribLPointer(见模式?).这些是查看该绑定的唯一函数.他们所做的是获取调用这些函数时绑定的缓冲区,并将该缓冲区与当前VAO相关联.GL_ARRAY_BUFFER是不是该VAO的部分状态.只有在调用这三个函数之一时,缓冲区对象才会与VAO关联.拨打电话后,您可以绑定任何您想要的内容GL_ARRAY_BUFFER.
GL_ELEMENT_ARRAY_BUFFER 是 VAO州的一部分.
在VAO设置期间是否必须分配缓冲存储器?如果在安装后调用BufferData,VAO会失效吗?
技术上没有,但是在存储之前不使用缓冲区是一种很好的形式.特别是如果它们是静态缓冲区.