我尝试创建一个带有两个纹理的FrameBuffer(多渲染目标)。然后在每个时间步骤中,两个纹理都会被清除并绘制,代码如下所示。(为了缩短长度,部分内容将被替换为伪代码。)
所有对象都正确渲染到两个纹理上,但是只有第一个纹理(ATTACHMENT0)在每一帧被清除,这是错误的。
版本2:
我试图插入一行代码...
第一版
//beginning of the 1st time step
initialize(framebufferID12)
//^ I quite sure it is done correctly,
//^ Note : there is no glDrawBuffers() calling
loop , do once every time step {
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID12);
//(#1#) a line will be add here in version 2 (see belowed) <------------
glClearColor (0.5f, 0.0f, 0.5f, 0.0f);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
// paint a lot of object here , using glsl (Shader .frag, .vert)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
所有对象都正确渲染到两个纹理上,但是只有第一个纹理(ATTACHMENT0)在每一帧被清除,这是错误的。
版本2:
我试图插入一行代码...
glDrawBuffers({ATTACHMENT0,ATTACHMENT1}) ;
在 (#1#) 上,它按预期工作,即清除了两个纹理。
(图像http://s13.postimg.org/66k9lr5av/gl_Draw_Buffer.jpg)
版本 3
从版本 2 开始,我将 glDrawBuffers() 语句移动到帧缓冲初始化中,就像这样:
initialize(int framebufferID12){
int nameFBO = glGenFramebuffersEXT();
int nameTexture0=glGenTextures();
int nameTexture1=glGenTextures();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,nameFBO);
glBindTexture(nameTexture0);
glTexImage2D( .... ); glTexParameteri(...);
glFramebufferTexture2DEXT( ATTACHMENT0, nameTexture0);
glBindTexture(nameTexture1);
glTexImage2D( .... ); glTexParameteri(...);
glFramebufferTexture2DEXT( ATTACHMENT0, nameTexture1);
glDrawBuffers({ATTACHMENT0,ATTACHMENT1}) ; //<--- moved here ---
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
return nameFBO ;
}
为什么它不再工作(和版本1的症状相似)?
OpenGL手册中指出,“对上下文状态所做的更改将存储在此对象中”,因此来自glDrawBuffers()的状态修改将存储在“framebufferID12”中,对吗?那么,为什么我每次步骤(或每次更改FBO时)都要调用它呢?
我可能误解了一些OpenGL的概念,请有经验的人给我启示。
编辑1:感谢j-p。我同意这是有道理的,但状态不应该已经记录在FBO中吗?
编辑2(接受答案):Reto Koradi的答案是正确的!我正在使用一个不太标准的库,叫做LWJGL。