我在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
我的问题是:
glDrawBuffer
和glBindTexture
之间有什么区别?是否有必要同时打电话? Aren的纹理附加到缓冲区? (我实际上无法测试它,因为我试图让它有效......)
谢谢!
答案 0 :(得分:2)
glBindTexture
将纹理与纹理采样器单元连接以进行读取。 glDrawBuffer
选择绘图写入的目的地。如果要选择纹理作为渲染目标,请在颜色附件上使用glDrawBuffer
附加纹理; 并确保它当前绑定的纹理采样器单元都不用作着色器输入!创建反馈循环的结果是未定义的。
答案 1 :(得分:1)
glDrawBuffer
选择要写入的颜色缓冲区(在本例中为framebuffer对象):
当颜色写入帧缓冲区时,它们被写入glDrawBuffer指定的颜色缓冲区
如果你想绘制多个颜色缓冲区,你可以编写
GLuint attachments[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, attachments);
而glBindTexture
将纹理绑定到纹理单元。
它们用于不同的目的 - 请记住,OpenGL及其当前的渲染上下文表现为状态机。