glBindBuffer 和直接状态访问?
glBindBuffer and direct state access?
根据 NVIDIA's OpenGL 4.5 Update presentation 的幻灯片 23,以下内容正确:
非 DSA:glGenBuffers + glBindBuffer
DSA:glCreateBuffers
我尝试编写一个仅 DSA 的程序。在使用 glDrawArraysIndirect
绘图时,我不得不使用 glBindBuffer
和 glCreateBuffers
这是工作代码的片段:
glCreateBuffers(1, &bufObj);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, bufObj); //If deleted creates SEGFAULT crash
glNamedBufferData(bufObj, sizeof(mydrawcall), mydrawcall, GL_STATIC_DRAW);
...
glDrawArraysIndirect(GL_TRIANGLES, 0);
glBindBuffer
是非 DSA 吗?
- 我是否缺少另一个较新的 DSA 功能,或者这是唯一的方法吗?
直接状态访问的目的不是从您的应用程序中完全删除对象绑定(这将是各种 "bindless" 扩展的目的)。直接状态访问的目的是允许您访问对象的状态而无需绑定它(即:directly)。
在 DSA 之前,您必须绑定缓冲区才能分配存储空间、上传数据等。有了 DSA 功能,您就不必这样做了。您将缓冲区直接传递给用于操作其状态的函数。
但要在渲染过程中实际使用 缓冲区,您仍然必须将其绑定到上下文或将其附加到其他对象,这些对象本身将绑定到上下文。
要将缓冲区的存储空间用作 uniform data, it must be bound to the context with glBindBufferRange(GL_UNIFORM_BUFFER
(or equivalent calls). To use a buffer to store vertex data, you must attach it to a VAO through glVertexArrayVertexBuffer
, then bind that VAO to the context. To use a buffer for pixel transfer operations,您必须使用 glBindBuffer
将缓冲区绑定到适当的位置。等等。
使用缓冲区作为间接命令执行的来源也是如此。那是一个渲染操作,所以缓冲区必须在发出间接命令之前绑定到间接目标。
但它只需要在您发出该命令时绑定。您不必在创建后立即绑定它。就在您实际调用 glDrawArraysIndirect
.
之前
根据 NVIDIA's OpenGL 4.5 Update presentation 的幻灯片 23,以下内容正确:
非 DSA:glGenBuffers + glBindBuffer
DSA:glCreateBuffers
我尝试编写一个仅 DSA 的程序。在使用 glDrawArraysIndirect
绘图时,我不得不使用 glBindBuffer
和 glCreateBuffers
这是工作代码的片段:
glCreateBuffers(1, &bufObj);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, bufObj); //If deleted creates SEGFAULT crash
glNamedBufferData(bufObj, sizeof(mydrawcall), mydrawcall, GL_STATIC_DRAW);
...
glDrawArraysIndirect(GL_TRIANGLES, 0);
glBindBuffer
是非 DSA 吗?- 我是否缺少另一个较新的 DSA 功能,或者这是唯一的方法吗?
直接状态访问的目的不是从您的应用程序中完全删除对象绑定(这将是各种 "bindless" 扩展的目的)。直接状态访问的目的是允许您访问对象的状态而无需绑定它(即:directly)。
在 DSA 之前,您必须绑定缓冲区才能分配存储空间、上传数据等。有了 DSA 功能,您就不必这样做了。您将缓冲区直接传递给用于操作其状态的函数。
但要在渲染过程中实际使用 缓冲区,您仍然必须将其绑定到上下文或将其附加到其他对象,这些对象本身将绑定到上下文。
要将缓冲区的存储空间用作 uniform data, it must be bound to the context with glBindBufferRange(GL_UNIFORM_BUFFER
(or equivalent calls). To use a buffer to store vertex data, you must attach it to a VAO through glVertexArrayVertexBuffer
, then bind that VAO to the context. To use a buffer for pixel transfer operations,您必须使用 glBindBuffer
将缓冲区绑定到适当的位置。等等。
使用缓冲区作为间接命令执行的来源也是如此。那是一个渲染操作,所以缓冲区必须在发出间接命令之前绑定到间接目标。
但它只需要在您发出该命令时绑定。您不必在创建后立即绑定它。就在您实际调用 glDrawArraysIndirect
.