OpenGL - 各种颜色附件的清晰颜色不同?

liv*_*muk 2 opengl glsl

我希望用不同的清晰颜色擦拭FBO的不同颜色附件.使用GL命令可以实现这一点,还是必须在着色器中执行此操作?

ybu*_*ill 9

glClear(GL_COLOR_BUFFER_BIT)使用全局设置(GL_COLOR_CLEAR_VALUE)的相同颜色清除当前颜色缓冲区.

OpenGL 2+

要为每个缓冲区指定不同的颜色,您必须通过以下方式更改当前缓冲区glDrawBuffer:

glDrawBuffer(GL_COLOR_ATTACHMENT0);
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glDrawBuffer(GL_COLOR_ATTACHMENT1);
glClearColor(1,0,0,1);
glClear(GL_COLOR_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)

OpenGL 3.0+

如果您已经设置了绘制缓冲区,则可以使用glClearBuffer它缩短为:

static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, draw_buffers);
// ...
static const float transparent[] = { 0, 0, 0, 0 };
glClearBufferfv(GL_COLOR, 0, transparent);
static const float red[] = { 1, 0, 0, 1 };
glClearBufferfv(GL_COLOR, 1, red);
Run Code Online (Sandbox Code Playgroud)

OpenGL 4.4+

但是,如果FBO由纹理支持,那么最简单的方法是glClearTexImage直接在这些纹理上使用:

// clear to transparent:
glClearTexImage(color_texture0, 0, GL_RGBA, GL_FLOAT, 0);

// clear to specified color:
static const float red = { 1, 0, 0, 1 };
glClearTexImage(color_texture1, 0, GL_RGBA, GL_FLOAT, red);
Run Code Online (Sandbox Code Playgroud)

  • @ybungalobill:“*这在实践中意味着它可能会胜过其他人*”这实际上取决于硬件。使用 Vulkan 时,我看到一些供应商的文档表明帧缓冲区清除比直接纹理清除快得多。诚然,这些是 TBR GPU,但原则上可能性仍然存在。如果帧缓冲区中有图像,则应通过帧缓冲区清除 API 清除它们,而不是纹理清除 API。而 `glClearNamedFramebuffer*` 是 DSA 等价物。 (2认同)