了解何时调用glBindBufferBase函数
我有一些需要在着色器中访问的SSBO。假设它是这样的:
layout(std430, binding = 2) readonly buffer MyBuffer
{
int myData[];
};
什么时候调用glBindBufferBase是合适的?
现在我做的事情大致如下
glBindBuffer(GL_SHADER_STORAGE_BUFFER, name)
glBufferData(...)
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, name)
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0)
我不知道这是否会设置某些全局状态,从而使我绑定和解除绑定的每个着色器的索引都设置为2。
你能告诉我这个想法是否有任何缺陷吗?
Create, Bind SSBO, upload data, unbind for the SSBO
Bind shader
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, name)
Draw arrays
Unbind shader
这是使用它的预期方式吗?我只绑定一次SSBO,上传数据,然后再也不绑定它。这似乎有效,但我不知道它是否“只是有效”,因为我的GPU试图替我聪明地处理,或者我是否违反了规范(我已经查看过规范,但找不到这个问题的答案)。以前我曾经碰到过这样的情况,我做了一些在我的GPU上可以正常工作的事情,但在另一个GPU上却失败了,这让我对自己的做法感到犹豫。
理想情况下,我希望能够通过一个单一的函数调用将我的SSBO替换到某个绑定中,然后进行绘制。我不确定是否可以在绑定着色器之前这样做,或者着色器是否必须被绑定。如果有更好的方法,请给予指导。
简而言之,最终目标是在数据上传后以最小的方式将某个SSBO绑定到某个索引上。