OpenGL帧缓冲:可以清除它,但不能绘制它

Red*_*mes 6 opengl framebuffer

在Mac上,我有一个OpenGL设置,除了帧缓冲区之外工作得很好 - 纹理工作等等.所以我知道纹理已经启用,我有一个有效的上下文等等.所有工作完美无缺,直到我尝试创建一个帧缓冲区.

我用glGenFramebuffers,glBindFramebuffer和glFramebufferTexture2D创建了一个framebuffer,glCheckFramebufferStatus返回GL_FRAMEBUFFER_COMPLETE.如果我然后调用glClear,然后调用glGetTexImage,返回的数据显示glClear就像应该的那样对绑定到帧缓冲区的纹理起作用.我可以将glClearColor设置为我想要的任何东西,glClear可以正确设置纹理数据.

但这就是好消息停止的地方.无论是使用VBO还是glBegin/glEnd,我都无法在帧缓冲区中绘制任何内容.绑定到帧缓冲区的纹理的纹理数据不受绘制调用的影响(尽管glClear结果仍然出现).即使我在glGetTexImage调用之前调用glFlush和glFinish也是如此.此外,glGetError对我的任何调用都没有返回任何错误.

我在下面发布了一些示例代码,我在程序的相关点添加了这些代码,试图解决这个问题,以防任何人有所了解.(这不包括glClear调用,但我知道从同一点的单独测试可以正常工作).

    glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbTexID, 0);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
if(status != GL_FRAMEBUFFER_COMPLETE)
    Debugger(); 

glEnable(GL_TEXTURE_2D); 
glCullFace(GL_NONE); 
glGenTextures(1,(GLuint*)&tex); 
glBindTexture(GL_TEXTURE_2D,tex); 
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL); 
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1024, 1024, 0, -5000, 5000); 
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); 
glViewport(0, 0, 1024, 1024); 
glColor4f(1,1,1,1); 
glBegin(GL_TRIANGLES);
    glTexCoord2f(0, 0);
    glVertex2f(0, 0);
    glTexCoord2f(1, 0);
    glVertex2f(1024, 0);
    glTexCoord2f(0, 1);
    glVertex2f(0, 1024);
glEnd();
glFlush();
glFinish(); 
unsigned char *dd = new unsigned char[1024*1024*4]; 
glBindTexture(GL_TEXTURE_2D, fbTexID); //I've tried calling glBindFramebuffer(GL_FRAMEBUFFER,0) before this bind - makes no difference
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, dd);
delete dd; 
Run Code Online (Sandbox Code Playgroud)

gon*_*nzo 9

你的纹理不起作用,因为它被束缚了!您不能将FBO上的绑定纹理作为rendertarget!这是一个没有很好记录的东西,但是当你想到它时才有意义驱动程序开发人员也需要一些保护措施,以防你做一些奇怪的事情,比如同时读取和写入相同的纹理


Red*_*mes 5

好的,回答了我自己的问题.看来,生成的纹理是帧缓冲区绘制的表面必须在生成帧缓冲区生成.所以,这有效:

glGenFramebuffers...
glBindFramebuffer...
glGenTextures...
glBindTexture...
glTexParameterf etc.
glFramebufferTexture2D...
Run Code Online (Sandbox Code Playgroud)

但这不是:

glGenTextures...
glBindTexture...
glGenFramebuffers
glBindFramebuffer...
glFramebufferTexture2D...
Run Code Online (Sandbox Code Playgroud)

我没有看到这在任何地方得到解决,这似乎令人惊讶,但我的代码从不工作到仅仅通过移动纹理的生成工作.