不太了解渲染缓冲区对象的操作。例如,如果我想显示渲染缓冲区中的内容,则必须将渲染渲染为纹理吗?
GLuint fbo,color_rbo,depth_rbo;
glGenFramebuffers(1,&fbo);
glBindFramebuffer(GL_FRAMEBUFFER,fbo);
glGenRenderbuffersEXT(1, &color_rb);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, color_rb);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, 256, 256);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,GL_RENDERBUFFER_EXT, color_rb);
glGenRenderbuffersEXT(1, &depth_rb);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_rb);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, 256, 256);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, depth_rb);
if(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)!=GL_FRAMEBUFFER_COMPLETE_EXT)return 1;
glBindFramebuffer(GL_FRAMEBUFFER,0);
//main loop
//This does not work :-(
glBindFramebuffer(GL_FRAMEBUFFER,fbo);
glClearColor(0.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawCube();
glBindFramebuffer(GL_FRAMEBUFFER,0);
任何想法?
当您使用FBO而不是默认帧缓冲区时,您将看不到任何东西,这是FBO的要点。
将渲染缓冲区拆分为另一个帧缓冲区(在这种情况下,可能是GL_BACK
默认的后缓冲区)
如果要查看结果,请绘制纹理附件,然后绘制纹理映射的图元(例如三角形/四边形)。
/* We are going to blit into the window (default framebuffer) */
glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0);
glDrawBuffer (GL_BACK); /* Use backbuffer as color dst. */
/* Read from your FBO */
glBindFramebuffer (GL_READ_FRAMEBUFFER, fbo);
glReadBuffer (GL_COLOR_ATTACHMENT0); /* Use Color Attachment 0 as color src. */
/* Copy the color and depth buffer from your FBO to the default framebuffer */
glBlitFramebuffer (0,0, width,height,
0,0, width,height,
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
GL_NEAREST);
首先,从一个帧缓冲区到另一个帧缓冲区的过渡通常比绘制两个充满整个视口的纹理三角形要慢得多。其次,当您对深度或模板图像进行模糊处理时,不能使用线性滤波...但是,如果您采用纹理映射方法,则可以使用线性滤波(这仅适用于在模糊处理时源缓冲区和目标缓冲区的分辨率不同的情况)。
总体而言,绘制带纹理的图元是更灵活的解决方案。如果需要进行“多重采样抗锯齿”,则“闪烁”最为有用,因为否则必须在着色器中实现该功能,并且在“帧缓冲区对象”之后添加了多重采样纹理处理。一些较旧的硬件/驱动程序支持FBO,但不支持多样本颜色(需要DX10硬件)或深度(需要DX10.1硬件)纹理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句