gpt4 book ai didi

opengl - 每个 BindBuffer 之后是否需要 VertexAttribPointer?

转载 作者:行者123 更新时间:2023-12-04 02:34:23 25 4
gpt4 key购买 nike

我注意到除非我重新调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com