gpt4 book ai didi

c++ - OpenGL 如何区分 VAO 中的绑定(bind)点与使用 glBindBufferBase 定义的绑定(bind)点?

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:06 25 4
gpt4 key购买 nike

我正在编写一个使用 OpenGL >= 4.3 的粒子模拟,但遇到了一个“问题”(或者更确切地说是没有问题),这让我很困惑。
对于计算着色器部分,我使用了各种 GL_SHADER_STORAGE_BUFFER,它们通过 glBindBufferBase() 绑定(bind)到绑定(bind)点。
其中一个 GL_SHADER_STORAGE_BUFFER 也用在顶点着色器中以提供渲染所需的法线。计算着色器和顶点着色器 GLSL(下面称为着色器 1)中的绑定(bind)如下所示:

OpenGL部分:

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, normals_ssbo);

GLSL部分:

...
layout(std430, binding = 1) buffer normals_ssbo
{
vec4 normals[];
};
...

有趣的是,在具有不同顶点着色器(下面称为着色器 2)的单独着色器程序中,绑定(bind)点 1 像这样(重新)使用:
GLSL:

layout(location = 1) in vec4 Normal;

但在这种情况下,法线来自不同的缓冲区对象,绑定(bind)是使用 VAO 完成的,如下所示:
OpenGL:

glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);

可以看到,数据的绑定(bind)点和布局(都是vec4)是一样的,只是实际的buffer对象不同。

现在回答我的问题:
为什么在设置着色器 1(使用 glBindBufferBase 进行绑定(bind))之后创建和使用的着色器 2 的 VAO 会无缝覆盖(?)绑定(bind)点,但着色器 1 仍然记得 SSBO 绑定(bind)并且在使用它们之前无需再次调用 glBindBufferBase 就可以正常工作?
OpenGL 如何知道绑定(bind)点(在两种情况下均为 1)应该使用这两个缓冲区对象中的哪一个?通过 VAO 和 glBindBufferBase 创建的绑定(bind)点是否完全独立?如果是这样,为什么这样的事情NOT 有效:

layout(std430, binding = 1) buffer normals_ssbo
{
vec4 normals[];
};
layout(location = 1) in vec4 Normal;

最佳答案

Are binding points created via VAO and glBindBufferBase simply completely seperate things?

是的,他们是。这就是为什么它们由两个不同的函数设置。

If that's the case, why does something like this NOT work:

有两种可能性。你在渲染端实现不正确,或者你的驱动程序有错误。如果不查看您的实际代码,就无法确定哪个是哪个。

关于c++ - OpenGL 如何区分 VAO 中的绑定(bind)点与使用 glBindBufferBase 定义的绑定(bind)点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com