gpt4 book ai didi

opengl - glBufferData 中目标参数的意义是什么

转载 作者:行者123 更新时间:2023-12-05 03:13:21 29 4
gpt4 key购买 nike

当创建一个 Buffer 并设置它的数据时,需要先将它绑定(bind)到一个 target,然后用一些数据填充绑定(bind)到该 target 的缓冲区:

GLenum target = GL_ARRAY_BUFFER;
glGenBuffers(1, &bufferId);
glBindBuffer(target, bufferId);
glBufferData(target, m_capacity*sizeof(value_type), m_data, GL_STREAM_DRAW);
glBindBuffer(target, 0);

但据我了解,如果我在 GL_ARRAY_BUFFER 目标上填充的缓冲区稍后用于例如GL_UNIFORM_BUFFER 目标。但如果是这种情况,为什么我们需要 target 来填充缓冲区,为什么 glBufferData 的签名不是:

void glBufferData(  GLint           bufferId,
GLsizeiptr size,
const GLvoid * data,
GLenum usage);

这只是一个历史原因,还是因为 opengl 是一个状态机,还是我错过了什么,target 还有其他用途。

最佳答案

这是一个常见的 OpenGL API 事物 - 大多数 OpenGL 对象(纹理、缓冲区等)的工作都是通过将它们绑定(bind)到特定的目标然后使用这个来完成的target 来引用当前绑定(bind)的对象(更多关于这个 here )。不幸的是,我不知道这个的确切原因,但它现在似乎已经成为历史 - 我已经看到一些通过对象 ID 直接访问对象的提议扩展(UPD:用户 ratchet freak says它是 direct_state_access 扩展,4.5 中的核心)。

documentationglBindBuffer 上说

When a buffer object is bound to a target, the previous binding for that target is automatically broken.

我认为更改缓冲区的绑定(bind)类型并期望缓冲区的状态保持不变并不是一个好主意。

更新

来自 OpenGL wiki

The target​ defines how you intend to use this binding of the buffer object. When you're just creating and/or filling the buffer object with data, the target you use doesn't technically matter.

因此,目标似乎只与您如何使用缓冲区有关,您可以安全地将它绑定(bind)到任何随机类型并用数据填充它,但这似乎仍然是一种不好的做法。

关于opengl - glBufferData 中目标参数的意义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30530010/

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