gpt4 book ai didi

opengl - glGenBuffers 和 glCreateBuffers 的区别

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

鉴于我们使用的是 OpenGL 4.5 或支持 GL_ARB_direct_state_access扩展,我们有新功能 glCreateBuffers .

此函数与 glGenBuffers 具有相同的签名。 ,但指定:

returns n previously unused buffer names in buffers, each representing a new buffer object initialized as if it had been bound to an unspecified target


glGenBuffers具有以下规范:

Buffer object names returned by a call to glGenBuffers are not returned by subsequent calls, unless they are first deleted with glDeleteBuffers.



因此 glCreateBuffers 返回的任何缓冲区名称永远不会再单独使用,但可以被 glGenBuffers 使用.

看来 glCreateBuffers总是会创建新的缓冲区对象并返回它们的名字, glGenBuffers只有在没有以前的缓冲区被删除的情况下才会创建新的缓冲区。

添加这个功能有什么好处?

我什么时候应该使用 glCreateBuffers超过 glGenBuffers ?

附言
我认为这代表所有 glCreate* GL_ARB_direct_state_access 添加的功能

最佳答案

您在这里注意到的基本上是整理 API 以确保与着色器和程序对象创建的一致性。这些总是在一次调用中生成和初始化,并且是 API 中唯一以这种方式工作的部分。所有其他对象首先使用 glGen* (...) 保留。然后通过将保留名称绑定(bind)到目标来初始化。

事实上,在 GL 3.0 之前,允许跳过 glGen* (...)完全通过在某处绑定(bind)一个唯一的数字来创建一个对象。

在 GL 4.5 中,每种类型的对象都被赋予了 glCreate* (...)在 GL 4.5 中的一次调用中生成和初始化它们的函数。这种方法非常适合直接状态访问,其中修改(在这种情况下创建)对象不需要更改(并可能恢复)绑定(bind)状态。

许多对象需要以这种方式使用 API 时的目标(例如纹理),但缓冲区对象对于所有意图和目的都是无类型的。这就是 API 签名相同的原因。当您使用此接口(interface)创建缓冲区对象时,它“被初始化,就好像它已绑定(bind)到未指定的目标一样”。对于 GL 中的大多数类型的对象,这完全是一派胡言。他们需要一个目标来正确初始化它们。

这里的主要考虑因素是,您可能希望在 GL 中为对象创建和设置状态,而不影响期望绑定(bind)到某个目标的对象保持不变的其他一些代码。这就是创建 Direct State Access 的目的,这也是这些功能存在的主要原因。

理论上,正如 dari 指出的那样,通过将缓冲区对象绑定(bind)到特定目标来初始化缓冲区对象可能会为驱动程序提供有关其预期用途的提示。不过,我不会在这方面投入太多,这与 glBufferData (...) 时的实际使用标志一样不确定。叫做;充其量是一个提示。

关于opengl - glGenBuffers 和 glCreateBuffers 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31841494/

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