首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解何时调用glBindBufferBase

理解何时调用glBindBufferBase
EN

Stack Overflow用户
提问于 2021-05-10 22:44:24
回答 1查看 434关注 0票数 1

我有一些SSBO可以在着色器中访问。让我们说,就像

代码语言:javascript
运行
复制
layout(std430, binding = 2) readonly buffer MyBuffer
{
    int myData[];
};

何时是调用glBindBufferBase的适当时间?

现在我做的事情就像

代码语言:javascript
运行
复制
glBindBuffer(GL_SHADER_STORAGE_BUFFER, name)
glBufferData(...)
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, name)
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0)

我不知道这是否设置了某种全局状态,为我绑定和取消绑定的每个着色器设置索引2。

你能告诉我这个想法有什么缺陷吗?

代码语言:javascript
运行
复制
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交换为一些绑定,然后绘制。我不确定在绑定着色器之前是否可以这样做,或者着色器是否必须绑定。如果有更好的方法,请告诉我。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-11 04:45:42

OpenGL是一个状态引擎。一旦设置了状态,它就会被保留,直到它再次被更改(甚至超过帧)。

缓冲区对象保持绑定到索引缓冲区目标,只要不将另一个缓冲区对象绑定到同一个绑定点即可。您只需要调用glBindBuffer,因为操作glBufferDataglBindBufferBase为那里的操作使用当前绑定的缓冲区。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67478469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档