【问题标题】:Defining a custom Blend Function (OpenGL)定义自定义混合函数 (OpenGL)
【发布时间】:2012-01-31 03:32:51
【问题描述】:

为了通过在中间位置实际渲染来实现物理上准确的运动模糊,似乎要正确地做到这一点,我需要一个特殊的混合功能。加法混合仅适用于黑色背景,标准的“透明度”功能(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 对于少量样本可能看起来不错,但它在物理上是不准确的,因为最后渲染的样本将对生成的颜色做出更多贡献。

我需要的函数必须生成一种颜色,它是原始颜色和目标颜色的加权平均值,具体取决于覆盖片段的样本数量。但是,我可以将其概括为更好地解释样本之间的渲染差异:假设我要渲染一个模糊对象 n 次。将颜色视为 3 向量,设 D 为颜色 DEST - SRC。我希望每个渲染都将D/n 添加到源颜色中。

这可以使用固定功能管道完成吗? The glBlendFunc reference 相当神秘,至少对我来说是这样。似乎这可以微不足道或不可能完成。似乎我想将 alpha 设置为1/n。对于我刚才描述的行为,我需要GL_DEST_MINUS_SRC_COLOR 选项吗?

我还有一个相关的问题:这个混合操作发生在哪个阶段?在片段着色器程序之前还是之后?我可以在片段着色器中访问源颜色和目标颜色吗?

我知道实现我想要的一种方法是使用累积缓冲区。我不想这样做,因为它浪费内存和填充率。

【问题讨论】:

  • 必须使用固定功能管道来执行此操作,因为还没有混合着色器。在片段着色之后也会发生混合。在管道的任何其他阶段,您都不知道像素的值。
  • 经过一番思考:我不明白您如何将状态放入 BlendFunc。通常您可以使用 BlendEquation 对其进行调整,但这对您没有帮助,因为管道的混合部分没有 number of rendering passes 的概念。但是,您可以使用片段着色器,在制服的帮助下计算正确的 alpha 值。
  • 你不能自己在片段程序中做吗?您可以将输入纹理放入纹理单元 1 到 8(或卡上的任何最大值)并在那里混合它们。
  • @pmr,我可以根据它的传递来计算颜色吗?
  • 你不能仅仅通过模糊特定对象来实现“物理上准确的运动模糊”。整个场景必须多次渲染。

标签: opengl graphics alphablending


【解决方案1】:

我最终用来实现我的效果的解决方案是添加混合和渲染目标的组合,我从片段着色器作为纹理访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2015-07-04
    • 2019-11-05
    • 1970-01-01
    相关资源
    最近更新 更多