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)
你的纹理不起作用,因为它被束缚了!您不能将FBO上的绑定纹理作为rendertarget!这是一个没有很好记录的东西,但是当你想到它时才有意义驱动程序开发人员也需要一些保护措施,以防你做一些奇怪的事情,比如同时读取和写入相同的纹理
好的,回答了我自己的问题.看来,生成的纹理是帧缓冲区绘制的表面必须在生成帧缓冲区后生成.所以,这有效:
glGenFramebuffers...
glBindFramebuffer...
glGenTextures...
glBindTexture...
glTexParameterf etc.
glFramebufferTexture2D...
Run Code Online (Sandbox Code Playgroud)
但这不是:
glGenTextures...
glBindTexture...
glGenFramebuffers
glBindFramebuffer...
glFramebufferTexture2D...
Run Code Online (Sandbox Code Playgroud)
我没有看到这在任何地方得到解决,这似乎令人惊讶,但我的代码从不工作到仅仅通过移动纹理的生成工作.