与glDrawBuffers()
设置的状态是帧缓冲区对象(FBO)状态的一部分。因此,只要您使用相同的FBO进行所有渲染,则每次要绘制到不同的缓冲区时都必须调用glDrawBuffers()
。
根据你的描述,我认为这将是您更容易使用多个宗教组织。用类似的伪符号,你在你的问题用一个,你可以在安装过程中进行这些调用一次:
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FBO1);
glFramebufferTexture2D(..., GL_COLOR_ATTACHMENT0, ..., BUFFER1, ...);
GLenum drawBuffers1[] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, drawBuffers1);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FBO2);
glFramebufferTexture2D(..., GL_COLOR_ATTACHMENT0, ..., BUFFER2, ...);
glFramebufferTexture2D(..., GL_COLOR_ATTACHMENT1, ..., BUFFER3, ...);
GLenum drawBuffers2[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, drawBuffers2);
,则每次渲染:
glUseProgram(SHADER1);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FBO1);
...
glUseProgram(SHADER2);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FBO2);
...
为了使这项工作,你的SHADER1
将有一个输出(位置0),SHADER2
有两个输出(位置0和1)。
如果由于某种原因,你想坚持一个FBO,使您的工作方式,你必须要小心,以获得您想要的结果:
GLenum drawBuffers2[] = { GL_NONE, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2};
glDrawBuffers(3, drawBuffers2);
通过这些设置,并使用着色器有两个输出,您必须将输出的位置设置为1和2(在着色器代码中使用glBindFragDataLocation()
或location
指令)。
你也可以用这个来代替:
GLenum drawBuffers2[] = {GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2};
glDrawBuffers(2, drawBuffers2);
与片段着色器输出位置0和1。其中一个缺点是,如果您想将代码移植到OpenGL ES,它将无法正常工作。在ES中,缓冲区只能是GL_NONE
或GL_COLOR_ATTACHMENT
或。
绘图缓冲区的默认设置仅为“GL_COLOR_ATTACHMENT0”。所以除非你更早的改变了这个值,否则它只能渲染到第一个缓冲区。 –