鉴于我们使用OpenGL 4.5或支持GL_ARB_direct_state_access扩展,我们有新功能glCreateBuffers.
此函数具有相同的签名glGenBuffers,但指定:
返回
n先前未使用的缓冲区名称buffers,每个缓冲区名称表示初始化的新缓冲区对象,就好像它已绑定到未指定的目标一样
glGenBuffers 有以下规格:
调用返回的缓冲区对象名称
glGenBuffers不会被后续调用返回,除非它们首先被删除glDeleteBuffers.
因此,返回的任何缓冲区名称glCreateBuffers将永远不会再次使用,但可以使用glGenBuffers.
似乎glCreateBuffers总会创建新的缓冲区对象并返回它们的名称,并且glGenBuffers只有在之前没有删除过的缓冲区时才会创建新的缓冲区.
添加此功能有什么优势?
我什么时候应该glCreateBuffers用完glGenBuffers?
PS
我认为这代表所有glCreate*添加的功能GL_ARB_direct_state_access
And*_*man 13
你在这里注意到的是基本上整理API以保持Shader和Program对象创建的一致性.它们总是在一次调用中生成和初始化,并且是以这种方式工作的API的唯一部分.每个其他对象首先使用glGen* (...),然后通过将保留名称绑定到目标来初始化.
实际上,在GL 3.0之前,允许glGen* (...)完全跳过并仅通过在某处绑定唯一编号来创建对象.
在GL 4.5中,为每种类型的对象提供了一个glCreate* (...)函数,该函数在GL 4.5中的单个调用中生成并初始化它们.此方法非常适合直接状态访问,其中修改(在这种情况下创建)对象不需要更改(并可能还原)绑定状态.
当以这种方式使用API时,许多对象需要目标(例如纹理),但缓冲对象用于所有意图和目的无类型.这就是API签名相同的原因.当您使用此接口创建缓冲区对象时,它将"初始化为好像已绑定到未指定的目标".这对于GL中的大多数类型的对象来说都是完全无稽之谈; 他们需要一个目标来正确初始化它们.
这里的主要考虑因素是您可能希望为GL中的对象创建和设置状态,而不会影响期望绑定到某个目标的对象保持不变的其他代码段.这就是创建Direct State Access的原因,也是这些功能存在的主要原因.
理论上,正如dari指出的那样,通过将缓冲区对象绑定到特定目标来初始化缓冲区对象可能会给驱动程序提供有关其预期用途的提示.我不会放多少钱,但是当glBufferData (...)调用它时,它就像实际使用标志一样; 充其量的暗示.
glCreateBuffers没有目标,因为缓冲区对象没有类型化。第一个绑定目标仅用作 OpenGL 中的提示。Khronos 考虑过给出glCreateBuffers一个target参数,但他们决定不这样做:
NamedBufferData(以及原始 EXT 中的相应函数)不包含 <target> 参数。实现是否可以根据此参数对数据存储的使用情况做出初步假设。它去哪儿了?我们应该把它带回来吗?
已解决:不需要缓冲区的目标参数。实现[原文如此]不会根据 <target> 参数做出使用假设。只有一个供应商扩展执行此操作 AMD_pinned_memory。[原文如此] 指定缓冲区使用情况的一致方法是为 BufferStorage 的 <flags> 参数添加一个新标志。
添加了强调。
OpenGL 4.5规范 - 6.1创建和绑定缓冲区对象:
通过将GenBuffers返回的名称绑定到缓冲区目标来创建缓冲区对象.通过调用实现绑定
void BindBuffer(枚举目标,uint缓冲区);
target必须是表6.1中列出的目标之一.如果先前尚未绑定名为buffer的缓冲区对象,则GL将创建一个新的状态向量,使用零大小的内存缓冲区进行初始化,并包含表6.2中列出的所有状态和相同的初始值.
因此,glGenBuffers和之间的区别在于glCreateBuffers,glGenBuffers它只返回一个未使用的名称,同时glCreateBuffers还创建并初始化上述状态向量.
用法:
建议使用glGenBuffers+ glBindBuffer,因为
GL可以基于初始绑定对存储位置和布局做出不同的选择.
由于glCreateBuffers没有给出初始绑定,因此无法做出这种选择.
| 归档时间: |
|
| 查看次数: |
10558 次 |
| 最近记录: |