gpt4 book ai didi

opengl - 普通 OpenGL 着色器存储缓冲区对象 (SSBO) 不起作用

转载 作者:行者123 更新时间:2023-12-01 15:04:10 25 4
gpt4 key购买 nike

我试图通过一个非常基本的示例来弄清楚 SSBO 是如何工作的。顶点着色器:

#version 430

layout(location = 0) in vec2 Vertex;

void main() {
gl_Position = vec4(Vertex, 0.0, 1.0);
}

和片段着色器:
#version 430

layout(std430, binding = 2) buffer ColorSSBO {
vec3 color;
};

void main() {
gl_FragColor = vec4(color, 1.0);
}

我知道它们有效,因为如果我替换 vec4(color, 1.0)vec4(1.0, 1.0, 1.0, 1.0)我在屏幕中央看到一个白色三角形。

我使用以下代码初始化和绑定(bind) SSBO:
GLuint ssbo;
glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
float color[] = {1.f, 1.f, 1.f};
glBufferData(GL_SHADER_STORAGE_BUFFER, 3*sizeof(float), color, GL_DYNAMIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

这里有什么问题?

最佳答案

我的猜测是您在渲染之前缺少 SSBO 绑定(bind)。在您的示例中,您正在复制内容,然后立即绑定(bind)它,这对于声明来说是不必要的。换句话说,您的示例中的以下行:

...
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, ssbo);
...

必须放在渲染前,如:
...
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, ssbo);

/*
Your render calls and other bindings here.
*/

glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
...

没有这个,你的着色器(理论上)将无法看到内容。

此外,如 Andon M. Coleman建议,在声明数组时必须为元素使用填充(例如,使用 vec4 而不是 vec3)。如果你不这样做,它显然会起作用,但由于这个事实会产生奇怪的结果。

以下两个链接帮助我理解了 SSBO 的含义以及如何在代码中处理它们:

https://www.khronos.org/opengl/wiki/Shader_Storage_Buffer_Object
http://www.geeks3d.com/20140704/tutorial-introduction-to-opengl-4-3-shader-storage-buffers-objects-ssbo-demo/

我希望这对任何面临类似问题的人有所帮助!

P.S.:我知道这篇文章很旧,但我想贡献一下。

关于opengl - 普通 OpenGL 着色器存储缓冲区对象 (SSBO) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32035423/

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