c++ - OpenGL MRT glDrawBuffers() 参数编号和行为

标签 c++ opengl rendering textures fbo

我总共有 5 个渲染目标。我使用相同的着色器写入前 4 个,然后在单独的 channel 中写入最后一个。

在对前 4 个目标调用渲染之前,我调用:

GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,  GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glDrawBuffers(4, drawBuffers);

但是,当我调用它进行第二遍并且只想写入最后一个,即第 5 个目标时,为什么以下会给出奇怪的结果?

GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT4 };
glDrawBuffers(1, drawBuffers);

为什么我必须改用:

GLenum drawBuffers[] = { GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_COLOR_ATTACHMENT4 };
glDrawBuffers(5, drawBuffers);

这仅仅是 glDrawBuffers() 的工作原理,还是由其他原因引起的?

编辑:关于 Jarrods 评论的固定代码

最佳答案

是的,这就是how glDrawBuffers works .但这是有原因的。

片段着色器写入映射到特定“颜色编号”的颜色输出。这些与 GL_COLOR_ATTACHMENT''i'' 数字无关glDrawBuffers 的全部意义在于将这些片段颜色编号映射到帧缓冲区中的实际缓冲区。

关于c++ - OpenGL MRT glDrawBuffers() 参数编号和行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15057145/

相关文章:

c++ - 如何刻意内联所有指定的STL代码?

c++ - std::vector 函数 push_back 中的奇怪段错误

java - LWJGL glTranslate 做奇怪的事情

performance - OpenGL在渲染“虚拟画廊”(纹理)方面的性能

html - 我可以将部分 HTML 页面导出为 SVG 图像吗?

java - jtable 中整行的删除线

c++ - 管道损坏,FIFO 文件

c++ - 数据交换的设计模式

c++ - 使用阴影贴图将 OpenGL 场景渲染为黑色

javascript - 如何检测不呈现 .png 透明度的浏览器