了解何时调用 glBindBufferBase

Wat*_*ter 5 opengl

我有一些 SSBO 可以在着色器中访问。让我们说它是这样的

layout(std430, binding = 2) readonly buffer MyBuffer
{
    int myData[];
};
Run Code Online (Sandbox Code Playgroud)

什么时候打电话比较合适glBindBufferBase

现在我做类似的事情

glBindBuffer(GL_SHADER_STORAGE_BUFFER, name)
glBufferData(...)
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, name)
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0)
Run Code Online (Sandbox Code Playgroud)

我不知道这是否会设置一些全局状态,从而为我绑定和取消绑定的每个着色器设置索引 2。

你能告诉我这个想法是否有任何缺陷:

Create, Bind SSBO, upload data, unbind for the SSBO

Bind shader
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, name)
Draw arrays
Unbind shader
Run Code Online (Sandbox Code Playgroud)

这是预期的使用方式吗?我只绑定一次SSBO,上传,然后就不再绑定了。这似乎有效,但我不知道它是否“正常工作”,因为我的 GPU 试图对我来说变得聪明,或者我是否违反了规范(我经历过但找不到这个问题的答案)。我曾经遇到过这样的情况:我做了一些可以在我的 GPU 上运行的事情,但在另一个 GPU 上却失败了,这让我对自己正在做的事情犹豫不决。

理想情况下,我希望进行一次函数调用,将 SSBO 交换到某种绑定中,然后进行绘制。我不确定是否可以在绑定着色器之前执行此操作,或者是否必须绑定着色器。如果有更好的方法来做到这一点,请建议。

简而言之,最终目标是在某些索引准备好用于上传数据后将某些 SSBO 绑定到某个索引上的最小方法。

Rab*_*d76 2

OpenGL 是一个状态引擎。一旦设置了状态,它就会保留,直到再次更改(甚至超出帧)。
只要您不将另一个缓冲区对象绑定到同一绑定点,缓冲区对象就会保持绑定到索引缓冲区目标。您只需要调用glBindBuffer, 因为操作 glBufferDataglBindBufferBase使用当前绑定的缓冲区进行操作。