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,根据规范,另外两个输出只是未定义的值