我试图通过一个非常基本的示例来弄清楚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),则在屏幕中央会看到一个白色三角形。

我用以下代码初始化并绑定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);

怎么了

最佳答案

绘制三角形时,需要三个点,并且每个点都需要3套单独的红绿蓝值。您只需将一组放入着色器缓冲区。对于其他两点,颜色值将降至默认值,即黑色(0.0,0.0,0.0)。如果未启用混合,则三角形可能会被完全涂成黑色,因为其两个顶点是黑色的。

尝试将另外2组红色,绿色,蓝色值放入存储缓冲区,以查看它将作为其他两个点的颜色值加载它们。

10-07 23:54