openGL FBO复制到纹理会产生黑/暗图像

openGL FBO复制到纹理会产生黑/暗图像,opengl,rendering,framebuffer,fbo,Opengl,Rendering,Framebuffer,Fbo,在我的程序中,有必要进行屏幕外渲染。为此,我使用FBO。为了查看我绘制的图像是否正确用于测试目的,我将其从FBO复制到纹理,然后将纹理渲染到四边形。问题是,当我从FBO复制到纹理并渲染它时,图像看起来很暗/得到黑色,但形状是正确的。我曾尝试在FBO中使用纹理作为附件,并直接渲染它(无需将其复制到另一个纹理),并且颜色正确。 下面是纹理创建的代码 //initial texture which works when rendered to a quad glGenTexturesEXT(3,

在我的程序中,有必要进行屏幕外渲染。为此,我使用FBO。为了查看我绘制的图像是否正确用于测试目的,我将其从FBO复制到纹理,然后将纹理渲染到四边形。问题是,当我从FBO复制到纹理并渲染它时,图像看起来很暗/得到黑色,但形状是正确的。我曾尝试在FBO中使用纹理作为附件,并直接渲染它(无需将其复制到另一个纹理),并且颜色正确。 下面是纹理创建的代码

//initial texture which works when rendered to a quad  
glGenTexturesEXT(3, &textureID[0]);
glBindTextureEXT(GL_TEXTURE_2D, textureID[0]);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 600, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
//second one which should be a copy of the above but has tha dark color mentioned
glBindTextureEXT(GL_TEXTURE_2D, textureID[1]);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 600, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTextureEXT(GL_TEXTURE_2D, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D,textureID[0],0);
  //Attach depth buffer to FBO
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb);
st1=glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
现在在渲染函数中

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); //biding FBO
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 //render code
unsigned char *pixels= new unsigned char [600*512*4];
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);  //unbiding
glBindTextureEXT(GL_TEXTURE_2D,textureID[1]); //if I change to textureID[0] result is fine
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,600,512,0,GL_RGBA,GL_UNSIGNED_BYTE,pixels);
glBindTextureEXT(GL_TEXTURE_2D,0);
glViewport(0, 0, 600, 512);
glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glBindTextureEXT(GL_TEXTURE_2D, textureID[1]);
  //setting the correct matrixes + render a quad
 //before rendering a quad I set the color with
glColor3f(1.0, 1.0, 1.0);
delete[] pixels;
glutSwapBuffers();

我正在使用glut进行设置。在取消绑定FBO并将纹理作为glReadPixels(…)的替代品进行绑定后,我尝试了其他函数,如GLGETEXIMAGE2D,但没有成功。

我不理解在第二个代码段中对glTexImage2D的调用<代码>像素将只包含垃圾。你期望它做什么



纹理是OpenGL的核心已经有很长很长时间了。它只是
glGenTextures
glBindTexture
而不是
…EXT
。另外,我建议您使用FBO功能的
…ARB
版本,或者只使用OpenGL核心帧缓冲区支持(更高版本的OpenGL)。

非常抱歉,当您在重新检查后提到这个奇怪的函数调用时,我发现了我愚蠢而幼稚的错误。我想从内存、像素复制到创建的纹理,并认为这就是实现这一点的功能。我之所以使用…EXT是因为我使用了EXT\u frame\u buffer\u对象,因为我的openGL版本只有2.0(据我所知,ARB是在3.0中引入的)。为了安全起见,我想使用..ext。我很抱歉提出这样一个愚蠢的问题,非常感谢你花时间在这件事上帮助我。ARB是在OpenGL-3之前引入的。OpenGL-3使它们成为核心功能。此外,EXT framebuffer并不意味着要使用EXT纹理函数。glGenTexturesEXT,glbindTextureText可以追溯到OpenGL-1.0,当时纹理本身是一个扩展(1994年)。