我试图通过一个非常基本的示例来弄清楚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组红色,绿色,蓝色值放入存储缓冲区,以查看它将作为其他两个点的颜色值加载它们。