我在opengl3上仍然是新手,并且正在尝试创建多通道渲染。
为此,我创建了FBO,生成了多个纹理,并使用

    unsigned index_col = 0;
    for (index_col = 0; index_col < nbr_textures;  ++index_col)
            glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index_col, texture_colors[index_col], 0);

它运作良好(我试图相信我在这里做的很好!)。

当我尝试在屏幕外的第一个纹理中渲染,然后在第二个纹理中,然后在屏幕上渲染时,出现了我的理解问题。
为了渲染为特定的纹理,我使用了:
FBO.bind();
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glBindTexture(GL_TEXTURE_2D, FBO.getColorTextures(0)); //getColorTextures(0) is texture_colors[0]

然后,我使用着色器进行绘制,然后执行以下操作:
glDrawBuffer(GL_COLOR_ATTACHMENT1);
glBindTexture(GL_TEXTURE_2D, FBO.getColorTextures(1));

毕竟
glBindFramebuffer(GL_FRAMEBUFFER, 0);
RenderToScreen(); // assuming this function render to screen with a quad

我的问题是:glDrawBufferglBindTexture有什么区别?有必要同时调用两者吗?纹理是否未附加到缓冲区? (我无法进行实际测试,因为我正在尝试使其正常运行...)

谢谢!

最佳答案

glBindTexture正在将纹理与纹理采样器单元连接以进行读取。 glDrawBuffer选择图形写入的目标。如果要选择纹理作为渲染目标,请在该颜色附加到的颜色附件上使用glDrawBuffer;并确保当前绑定(bind)到的所有纹理采样器单元都不用作着色器输入!创建反馈回路的结果是不确定的。

09-10 21:01