在固定函数管道图中使用FBO将OpenGL场景渲染为纹理 问题

在固定函数管道图中使用FBO将OpenGL场景渲染为纹理 问题,opengl,textures,fbo,render-to-texture,Opengl,Textures,Fbo,Render To Texture,我从事开源游戏torcs()。 游戏的图形管道仍然使用OpenGL 1.3的固定功能管道(FFP) 我尝试将游戏场景渲染为FBO(帧缓冲区对象)中的纹理,以便对渲染的纹理进行一些后处理。我使用OpenGL 3.3。在我的机器上 目前,我已在GL\u COLOR\u ATTACHMENT0&1(2以使着色器中的两个连续帧可读)和GL\u DEPTH\u ATTACHMENT处的附加渲染缓冲区设置了FBO 绑定FBO后,执行游戏渲染功能。当我随后解除FBO绑定并通过着色器程序将纹理写回窗口缓冲区进行

我从事开源游戏torcs()。 游戏的图形管道仍然使用OpenGL 1.3的固定功能管道(FFP)

我尝试将游戏场景渲染为FBO(帧缓冲区对象)中的纹理,以便对渲染的纹理进行一些后处理。我使用OpenGL 3.3。在我的机器上

目前,我已在
GL\u COLOR\u ATTACHMENT0&1
(2以使着色器中的两个连续帧可读)和
GL\u DEPTH\u ATTACHMENT
处的附加渲染缓冲区设置了FBO

绑定FBO后,执行游戏渲染功能。当我随后解除FBO绑定并通过着色器程序将纹理写回窗口缓冲区进行验证时,场景是不完整的。更具体地说,只渲染汽车的轮廓,轮胎的打滑痕迹和一些烟雾也是如此。这表明某些内容渲染到FBO的纹理,但不是所有内容。其中,没有纹理(用于树、房子、草等)渲染到FBO中的纹理。这表明我的纹理设置不正确,但不幸的是,我对OpenGL的了解有限,这就是我希望得到您帮助的原因

另一件值得注意的事情是,如果我省略了行
glActiveTexture(GL_TEXTURE0)在绘制之前,将显示一个纹理(即,将写入FBO并写回车窗系统帧缓冲区,而不是汽车轮廓)

代码 以下代码显示FBO的初始化(从):

int屏幕宽度=640;
内部屏幕高度=480;
/*纹理A*/
glGenTextures(1和fbo_纹理);
glBindTexture(GL_纹理_2D,fbo_纹理);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,屏幕宽度,屏幕高度,0,GL_RGBA,GL_无符号字节,NULL);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glBindTexture(GL_TEXTURE_2D,0);
/*纹理B*/
//玻璃结构(GL_纹理1);
glGenTextures(1和fbo_纹理_a);
glBindTexture(GL_纹理_2D,fbo_纹理_a);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,屏幕宽度,屏幕高度,0,GL_RGBA,GL_无符号字节,NULL);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glBindTexture(GL_TEXTURE_2D,0);
/*深度缓冲器*/
glGenRenderbuffers(1和rbo_深度);
glBindRenderbuffer(GL_RENDERBUFFER,rbo_深度);
GLrenderBuffer存储(GL_RENDERBUFFER、GL_DEPTH_component 16、屏幕宽度、屏幕高度);
glBindRenderbuffer(GL_RENDERBUFFER,0);
/*帧缓冲区将所有内容链接在一起*/
GLGEN帧缓冲区(1,&fbo);
glBindFramebuffer(GL_FRAMEBUFFER,fbo);
glFramebufferTexture2D(GL_帧缓冲区、GL_颜色_附件0、GL_纹理_2D、fbo_纹理,0);
glFramebufferTexture2D(GL_帧缓冲区、GL_颜色_附件1、GL_纹理_2D、fbo_纹理_a、0);
glFramebufferRenderbuffer(GL_帧缓冲区、GL_深度附件、GL_RENDERBUFFER、rbo_深度);
盂状态;
如果((状态=glCheckFramebufferStatus(GL\U FRAMEBUFFER))!=GL\U FRAMEBUFFER\U COMPLETE){
fprintf(stderr,“glCheckFramebufferStatus:错误0x%x”,状态);
返回0;
}
glBindFramebuffer(GL_帧缓冲区,0);
/*编译和链接着色器*/
...
以下代码显示绘图发生的位置: 编辑:如果
使用\u fbo=false
,则所有内容都将像以前一样直接呈现到屏幕上。我所做的更改仅在括号内

if(使用fbo)
{
glBindFramebuffer(GL_FRAMEBUFFER,fbo);
glPushAttrib(GLU视口位);
glViewport(0,0,grWinw,grWinh);
if(fbo_a)//绘制到fbo_纹理
{               
glDrawBuffer(GL_颜色_附件1);
玻璃纹理(GL_纹理0+11);
glEnable(GL_纹理_2D);
glBindTexture(GL_纹理_2D,fbo_纹理_a);
}
其他的
{
glDrawBuffer(GL_颜色_附件0);
玻璃纹理(GL_纹理0+12);
glEnable(GL_纹理_2D);
glBindTexture(GL_纹理_2D,fbo_纹理);
}
玻璃纹理(GL_纹理0);
glEnable(GL_纹理_2D);
}
glClearColor(0.7f、0.1f、0.1f、1.0f);//用红色清除以查看绘制到fbo的内容
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
grScreens[0]->更新(s,grFps);//这是在TORCS中图形与原始图形保持不变的地方
如果(使用_fbo)
{
glpopatrib();
glBindFramebuffer(GL_帧缓冲区,0);
glEnable(GL_纹理_2D);
glDrawBuffer(GL_BACK);
glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glUseProgram(program_postproc);
if(fbo_a)//绘制到fbo_纹理
{
glUniform1i(均匀的fbo_纹理,11);
glUniform1i(均匀纹理a,12);
fbo_a=!fbo_a;
}
其他的
{
glUniform1i(均匀纹理,12);
glUniform1i(均匀纹理,11);
fbo_a=!fbo_a;
}
GlenableVertexAttributeArray(属性_v_coord_postproc);
glBindBuffer(GL_数组_缓冲区、vbo_fbo_顶点);
glvertexattributepointer(
属性_v_coord_postproc,2,GL_FLOAT,GL_FALSE,0,0);
gldrawArray(GL_三角带,0,4);
GLDISABLEVERTEXATTRIBARRY(属性\u v\u坐标\u后过程);
glUseProgram(0);
}
我希望我提供了足够的信息给你来帮助我。任何建议都将不胜感激

编辑:我再次检查了我的着色器代码和FBO实现(使用简化的绘图将其简化为一个颜色附件等),所有这些都是w
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, screen_width, screen_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
GL_COLOR_ATTACHMENT0: GL_RGBA,GL_RGBA,GL_UNSIGNED_BYTE
GL_COLOR_ATTACHMENT1: GL_RGBA,GL_RGBA,GL_UNSIGNED_BYTE
GL_COLOR_ATTACHMENT0 : GL_RGBA           , GL_RGBA8            , GL_UNSIGNED_BYTE
GL_DEPTH_ATTACHMENT  : GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT16, GL_UNSIGNED_BYTE
GL_STENCIL_ATTACHMENT: GL_STENCIL_INDEX  , GL_STENCIL_INDEX8   , GL_UNSIGNED_BYTE