【发布时间】: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