我看到我可以使用绑定顶点缓冲区glBindBuffer(GL_ARRAY_BUFFER, vbo);.这有效,我也可以使用绑定元素数组glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);.使用这些时,一切都按照需要绘制.
在阅读第10.3.1节中的OpenGL 4.4规范时,我发现了glBindVertexBuffer.看起来这样可以绑定多个顶点缓冲区,然后让它们一次全部渲染.它是否正确?另外,它与使用有glBindBuffer什么不同?在使用此绑定顶点缓冲区时,您可以使用元素数组缓冲区吗?
And*_*man 16
实际上,重点glBindVertexBuffer (...)是完全不同.
引入它时的想法GL_ARB_vertex_attrib_binding是分离顶点缓冲区和指针之间始终存在的固定映射,并用更灵活的系统替换它,允许您设置顶点属性的格式,顶点缓冲区的绑定位置 /要使用的属性,然后简单地换出绑定到该位置的缓冲区.
你不会简单地用glBindBuffer (...)这个新函数替换一个调用,你需要调用至少两个其他函数来设置一个通用的顶点属性,以便能够利用glBindVertexBuffer (...):
glVertexAttribFormat (...)
glVertexAttribPointer (...)除了它没有设置指针,它只是建立将如何解释将与此属性配对的缓冲区.
glVertexAttribBinding (...)
glBindVertexBuffer (...)将VBO绑定到此属性将使用的位置.为了glVertexAttribPointer (...)更好地理解这一点,我在扩展规范中包含了一些伪代码,这些伪代码展示了如何与这个新的API添加相关.
void glVertexAttribPointer (GLuint index, GLint size, GLenum type,
GLboolean normalized, GLsizei stride,
const GLvoid *pointer);
void glVertexAttribIPointer (GLuint index, GLint size, GLenum type,
GLsizei stride, const GLvoid *pointer);
void glVertexAttribLPointer (GLuint index, GLint size, GLenum type,
GLsizei stride, const GLvoid *pointer);
Run Code Online (Sandbox Code Playgroud)
控制顶点属性状态,顶点缓冲区绑定以及顶点属性和顶点缓冲区绑定之间的映射.
Run Code Online (Sandbox Code Playgroud)if (no buffer is bound to GL_ARRAY_BUFFER and pointer != NULL) { generate GL_INVALID_OPERATION; } glVertexAttrib*Format (index, size, type, {normalized, }, 0); glVertexAttribBinding (index, index); if (stride != 0) { effectiveStride = stride; } else { compute effectiveStride based on size/type; } GL_VERTEX_ATTRIB_ARRAY_STRIDE[index] = stride; // GL_VERTEX_BINDING_STRIDE will be set to effectiveStride // by glBindVertexBuffer. glBindVertexBuffer (index, <buffer bound to GL_ARRAY_BUFFER>, (GLchar *)pointer - (GLchar *)NULL, effectiveStride);
首先包裹你的头部有点困难,但它归结为非常类似于在GL 3.3中引入采样器对象时采样器状态与纹理对象的分离.您可以继续使用旧API,但此替代解决方案可为您提供更多灵活性.
关于元素数组缓冲区,没有.API的这一新部分与此无关,因为顶点数组对象实际上管理了唯一的元素数组缓冲区绑定.
| 归档时间: |
|
| 查看次数: |
3803 次 |
| 最近记录: |