【问题标题】:Using multiple blendfunc OpenGL使用多个 blendfunc OpenGL
【发布时间】:2013-07-03 05:02:44
【问题描述】:

我想用

glBlendFunc(GL_ONE, GL_ONE) 

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 

同时。这可能吗?

【问题讨论】:

    标签: opengl alpha blend glblendfunc


    【解决方案1】:

    您可以创建一个附有纹理的屏幕外Framebuffer Object。使用glBlendFunc(GL_ONE, GL_ONE) 执行第一次渲染,然后翻转输入和输出纹理并使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 执行第二次渲染。

    【讨论】:

    • 这是否也可以同时附加两个纹理(颜色附件 0 和 1),着色器向两者输出相同的颜色,并为附件使用两个单独的混合函数?
    • @leemes 混合函数是全局的,它们适用于所有事物。如果你想做单独的混合,你必须在你的着色器中单独实现它。
    • 如何在着色器中实现混合? AFAIK,着色器输出一种颜色 (vec4),该颜色由 unprogrammable 渲染管道使用主机程序中设置的混合函数进行混合。当然,我可以有一个带有预乘 alpha 的缓冲区,第二个带有“正常”alpha 混合的缓冲区,只需选择一个适用于预乘 alpha 的混合函数并手动将 alpha 值预乘到着色器中的第二种颜色。但是在某些情况下,这不是一种选择,例如当我只想总结第二个缓冲区中的颜色时,第一个应该进行“正常”的 alpha 混合。
    • @leemes 您需要进行多阶段渲染,在其中渲染到第一个纹理作为输出,然后翻转它,使其成为第二阶段的输入。您可以使用允许您从当前片段读取的 OpenGL 扩展来组合这两个阶段。
    • 感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 2013-02-04
    • 1970-01-01
    • 2013-04-14
    • 2013-12-29
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多