【问题标题】:OpengGL Light BlendingOpengL 光混合
【发布时间】:2014-02-20 22:16:00
【问题描述】:

我正在使用 Java 和 LWJGL 为我的游戏编写灯光/阴影系统。对于每个发光实体,我都会生成这样一个纹理:

我应该警告你,这些纹理充满了 (0, 0, 1) 或 (1, 0, 0) 像素,并且渐变效果是通过 Alpha 通道实现的。我将 Alpha 通道解释为梯度因子。

之后,我希望将每个光/影纹理混合到一个纹理上,每个纹理都位于其各自正确的位置。为此,我使用了帧缓冲区。我尝试使用以下混合方程/函数组合来达到预期的效果:

glBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX);
glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_DST_ALPHA, GL_ONE, GL_ONE);

我为 Alpha Channel Blend Function 任意选择了 GL_ONE/GL_ONE,因为 GL_MAX 只会做 max(Sa, Da),如 here 所述,这意味着不使用缩放因子。这种组合的结果如下: 此图像是使用 Apple 的 OpenGL Driver Profiler 获得的,因此我没有使用我的应用程序渲染它(这可能会影响最终结果)。下一步是使用多重混合在实际游戏中渲染此纹理,以使图像变暗,但光/阴影纹理显然是错误的,因为我们可以看到各个光/阴影纹理的边缘相互重叠.

我应该如何进行才能达到预期的效果?

编辑: 我忘了解释我对比例因子的选择: 我认为简单地添加每个光的颜色(用它们各自的 alpha 值思考它们中的每一个)并选择最终片段的 alpha 作为每个重叠光中最大的一个是正确的。

【问题讨论】:

    标签: opengl rendering alphablending blending


    【解决方案1】:

    想象一下,您的纹理矩形之一以某种任意图案延伸到其当前边界之外,例如纯绿色。进一步想象一下,我们以某种方式被允许使用两种不同的混合功能,一种在边界内,一种在边界外。如果在边界外使用混合功能,您将获得与此处相同的图像(没有绿色显示)

    glBlendFuncSeparateEXT(GL_ZERO, GL_ONE, GL_ONE, GL_ONE)
    

    然后,我们希望我们在内部使用的任何混合函数都能为我们提供连续的混合结果。混合功能

    glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_DST_ALPHA, GL_ONE, GL_ONE)
    

    不会给我们这样的结果。这并不是因为第一个参数意味着忽略边界附近的源(如果我正确阅读了您的图像描述,则边界上的小 alpha )。所以它必须是第二个参数。仅当源 alpha 较小时,我们才需要目标。将GL_DST_ALPHA 更改为GL_ONE_MINUS_SRC_ALPHA。这会更标准,但也许我不了解您的目标?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多