【问题标题】:Custom blending equations (shader) for OpenGLOpenGL 的自定义混合方程(着色器)
【发布时间】:2018-07-12 13:01:25
【问题描述】:

我正在尝试使用 OpenGL 为透明对象尝试不同的 alpha 混合方程,但看起来片段着色器对单个对象上的片段颜色进行操作,并且无法考虑对象背后的场景。

另一方面,似乎没有办法用任意 GLSL 代码拦截 blending stage,例如,我想不出用当前 OpenGL 原语重现 soft light blend mode 的方法。

有没有办法调和这些?

【问题讨论】:

  • 如果需要复杂的混合功能,可以渲染成纹理。然后,在第二遍中,在您的片段着色器中,您可以从代表先前渲染对象的纹理中进行查询,并自行进行混合。问题是您需要为每个对象调用glDraw*,再加上另一个将纹理blit 到帧缓冲区。也许对 SSBO 使用原子操作会更好。

标签: opengl glsl alphablending


【解决方案1】:

有几个比较受支持的扩展:

【讨论】:

  • 考虑到 only Intel hardware supports it. 甚至大多数英特尔硬件都不是,我认为将 framebuffer fetch 称为“支持良好”是不公平的。
  • @NicolBolas Mali、Tegra 和 iPhone 中的任何东西也支持它(可能带有不同的前缀)。
  • 我相信他们会这样做。但是由于这个问题被标记为 OpenGL,从来没有提到 OpenGL ES,而且这些 GPU 只提供 OpenGL ES,它们与这个讨论并不真正相关。
【解决方案2】:

混合仍然是片段管道中为数不多的部分之一,它是 GPU 上的硬连线电路。因此它不是可编程的。最好的办法是渲染到纹理并进行混合后处理。

【讨论】:

    【解决方案3】:

    复制渲染目标,并用它作为纹理绘制你的对象。

    如果有很多小对象,则只能复制部分渲染目标。

    第一遍:将具有渲染目标的对象作为纹理绘制到texture_2;

    第二遍:使用texture_2绘制对象以渲染目标;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      相关资源
      最近更新 更多