C 为什么在OpenGL中,同一条管线生成的渲染缓冲区数据不同?

C 为什么在OpenGL中,同一条管线生成的渲染缓冲区数据不同?,c,opengl,C,Opengl,全部代码: //two triangles color and position data Vertex Verts[9] = { { { 255,0,0,255 },{ 0.0f, 0.9f, 0.0f } }, { { 0,255,0,255 },{ -0.9f, -0.9f, 0.0f } }, { { 0,0,255,255 },{ 0.9f, -0.9f, 0.0f } } , { { 255,255,255,255 },{ 0.0f, 0.8f, -

全部代码:

//two triangles color and position data
Vertex Verts[9] = { 
    { { 255,0,0,255 },{ 0.0f, 0.9f, 0.0f } },
    { { 0,255,0,255 },{ -0.9f, -0.9f, 0.0f } },
    { { 0,0,255,255 },{ 0.9f, -0.9f, 0.0f } } ,
    { { 255,255,255,255 },{ 0.0f, 0.8f, -0.2f } } ,
    { { 255,255,255,255 },{ -0.4f, 0.0f, -0.2f } } ,
    { { 255,255,255,255 },{ 0.4f, 0.0f, -0.2f } } ,
};
GLuint Program = 0;
GLuint vert;
GLuint vbo;
GLuint RendBuf[4], FrameBuf[2];
这是缓冲区集代码:

void Init()
{
    glGenVertexArrays(1, &vert);
    glBindVertexArray(vert);
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Verts), Verts, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), BUFFER_OFFSET(0));
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(Verts->color)));
    glEnableVertexAttribArray(1);
    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    glUseProgram(Program);
我生成4个渲染缓冲区、一个深度缓冲区和三色缓冲区:

    glGenRenderbuffers(4, RendBuf);
    glBindRenderbuffer(GL_RENDERBUFFER, RendBuf[0]);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 200, 200);
    glBindRenderbuffer(GL_RENDERBUFFER, RendBuf[1]);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 200, 200);
    glBindRenderbuffer(GL_RENDERBUFFER, RendBuf[2]);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 200, 200);
    glBindRenderbuffer(GL_RENDERBUFFER, RendBuf[3]);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 200, 200);
    //all buffer objects are bound to framebuffer object:FrameBuf[0]
    glGenFramebuffers(1, &FrameBuf[0]);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FrameBuf[0]);
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, RendBuf[0]);  
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, RendBuf[2]);
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, RendBuf[1]);   
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_RENDERBUFFER, RendBuf[3]);
}
这是渲染代码:

void Display()
{
    //draw in framebuffer
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FrameBuf[0]);
    glViewport(0, 0, 200, 200);
    GLenum bufs[3] = { GL_COLOR_ATTACHMENT0 , GL_COLOR_ATTACHMENT1 , GL_COLOR_ATTACHMENT2};
    glDrawBuffers(3,bufs);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
更改三个三角形的背景色

    float Color[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    glClearBufferfv(GL_COLOR, 0, Color);
    float Color1[] = { 1.0f, 1.0f, 0.0f, 1.0f };
    glClearBufferfv(GL_COLOR, 1, Color1);
    float Color2[] = { 0.0f, 1.0f, 1.0f, 1.0f };
    glClearBufferfv(GL_COLOR, 2, Color2);
    glBindVertexArray(vert);
    glEnable(GL_DEPTH_TEST);
    glDrawArrays(GL_TRIANGLES, 0, 6);
将数据从帧缓冲区复制到屏幕缓冲区

    glBindFramebuffer(GL_READ_FRAMEBUFFER, FrameBuf[0]);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
    glViewport(0, 0, 400, 400);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glReadBuffer(GL_COLOR_ATTACHMENT0);
    glBlitFramebuffer(0, 0, 200, 200, 0, 0, 200, 200, GL_COLOR_BUFFER_BIT, GL_NEAREST);
    glReadBuffer(GL_COLOR_ATTACHMENT1);
    glBlitFramebuffer(0, 0, 200, 200, 200, 0, 400, 200,GL_COLOR_BUFFER_BIT, GL_NEAREST);
    glReadBuffer(GL_COLOR_ATTACHMENT2);
    glBlitFramebuffer(0, 0, 200, 200, 0, 200, 200, 400,GL_COLOR_BUFFER_BIT, GL_NEAREST);
    glutSwapBuffers();
}
顶点着色器和片段着色器:

layout(location = 0) in vec4 vColor;
layout(location = 1) in vec4 vPos;
void main()
{
    gl_Position = vPos;
    color = vColor;
}

layout(location = 0) out vec4 fColor;
layout(location = 1) out vec4 fColor2;
void main()
{
    fColor = color;
    fColor2 = vec4(0.0, 0.0, 1.0, 1.0);
}

第一个三角形是正确的,第二个是黄色背景上的蓝色三角形,第三个只是浅蓝色背景。

请添加您的着色器。我已在问题末尾添加了着色器,谢谢帮助!我认为问题来自函数glDrawBuffers(),片段着色器应该将相同的数据写入渲染缓冲区GL_COLOR_ATTACHMENT0和GL_COLOR_ATTACHMENT1,但结果不是这样。最后一个三角形的顶点数据是什么?着色器只写入一个输出,很可能最终成为颜色索引0,输出的两个输出只是未定义的值,根据规范,请添加您的着色器。我已经在问题的末尾添加了着色器,谢谢帮助!我认为问题来自函数glDrawBuffers(),片段着色器应该将相同的数据写入渲染缓冲区GL_COLOR_ATTACHMENT0和GL_COLOR_ATTACHMENT1,但结果不是这样。最后一个三角形的顶点数据是什么?着色器只写入一个输出,很可能最终成为颜色索引0,根据规范,另外两个输出只是未定义的值