【问题标题】:Is it possible to clear just certain textures in a framebuffer with multi target rendering?是否可以通过多目标渲染仅清除帧缓冲区中的某些纹理?
【发布时间】:2013-08-04 10:53:44
【问题描述】:

我有一个帧缓冲区对象,我在其中对绑定到它的 N 个纹理使用多目标渲染。在某个时间,我想清除其中一些纹理的内容,但不是全部。 如果我打电话给

glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

绑定到 FBO 的每个纹理都将被清除(对吗?)。 有没有办法在特定的绘制缓冲区/纹理上做到这一点?

【问题讨论】:

    标签: opengl fbo


    【解决方案1】:

    这将是所有缓冲区。 不过,您可以使用 glColorMask 屏蔽缓冲区以进行清除。 http://www.opengl.org/sdk/docs/man/xhtml/glColorMask.xml

    【讨论】:

    • 有两个版本。点击我的链接。经典的一个屏蔽组件,第二个屏蔽每个缓冲区的组件。
    • 谢谢,这个 glColorMaski 似乎是一个很好的解决方案。为什么这个答案是-1?
    • @darius:它得到了-1,因为 OpenGL 具有直接清除特定缓冲区的功能。屏蔽组件以防止缓冲区清除是不适合这项工作的工具。
    • 您提出 ClearBuffer 是对的。我没有想到它,它可能会使他的代码更干净。我仍然可以想出屏蔽会减少 gl 调用的场景,但是很好:) 本着学习的精神:我仍然认为你错过了这样一个事实,即存在第二个 glColorMask 版本,即 (bufferindex, r, g, b , 一)。
    • @starmole:不,我明白了(这就是我删除我的评论并支持你的评论的原因)。它仍然是工作的错误工具。完全可以避免时,无需设置全局状态来清除缓冲区。
    【解决方案2】:

    the glClear call 中的GL_COLOR_BUFFER_BIT 将清除通过glDrawBuffers 指定的所有active draw color buffers。因此,您可以在执行清除之前更改绘图缓冲区。

    但那是不必要的状态改变。你可以simply call glClearBuffer,这将是clear a particular buffer

    【讨论】:

    • 谢谢。 glClearBufferfv 的正确用法是什么? glClearBufferfv( GL_COLOR_ATTACHEMENT0, 0, &color[0] ) 可以吗? (其中颜色是一个 float[4] 数组)
    • @darius: "glClearBufferfv" 采用浮点数组。这就是the "fv" always means。在这种情况下,它总是 4 个浮点数。就像iv 版本需要 4 个有符号整数(用于清除整数格式缓冲区),uiv 需要 4 个无符号整数。
    • 感谢您的链接!实际上,我真正怀疑的部分是前两个论点。如果我理解正确,它们是缓冲区的 GLenum,以及它在 GLenum 的颜色缓冲区数组中的位置。所以,一般来说,像 GL_COLOR_ATTACHEMENT0+i, i 之类的东西
    • @darius:手册页直接说明了这两个参数的含义。 不是这样。事实上,我链接到的关于缓冲区清除的 wiki 文章也解释了这些参数。
    • 感谢您的耐心等待!我会再读一遍那篇文章。
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多