我注意到,除非我重新调用VertexAttribPointer,否则BindBuffer之后不会向着色器输入。那有必要吗?着色器的写入可能不会发生变化,而仅更改了使用的缓冲区。

最佳答案

tibur已经回答了实际问题,但我想我要添加一些上下文。
glBindBuffer(GL_ARRAY_BUFFER, ...)本身不执行任何操作。将其视为glVertexAttribPointer的额外参数。

请记住,您可以将多个缓冲区绑定(bind)到不同的属性(例如attrib 0使用vbo 1,而attrib 1和2使用vbo 2)。对于该设置,您会看到什么API顺序?

使用实际的API,它类似于:

glBindBuffer(GL_ARRAY_BUFFER, 1);
glVertexAttribPointer(0, ...)
glBindBuffer(GL_ARRAY_BUFFER, 2);
glVertexAttribPointer(1, ...)
glVertexAttribPointer(2, ...)

glDraw*(...)

为什么规范会以这种方式工作?好吧,它向后兼容的特性引起了人们的注意。当引入VBO时,glVertexPointer等人。没有任何参数可以传递要使用的缓冲区对象。每种语义都有许多新的入口点(VertexPointer/NormalPointer/TexCoordPointer ...),或者它本身是一个额外的入口点,它只是* Pointer调用的一个额外参数。他们选择了后者(作为附带说明,这也是为什么您必须在缓冲区内传递偏移量作为指针的原因)。

关于opengl - 每个BindBuffer之后需要VertexAttribPointer吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3665671/

10-11 16:52