1

在尝试将我的 2D 阴影渲染技术从 Directx 移植到 Opengl 的过程中,我遇到了一个问题,我似乎无法很好地访问 opengl 混合器。

但首先,为了使以下内容有意义,我的算法:

我在不使用深度缓冲区的情况下从后到前对所有精灵进行排序和渲染。阴影精灵在投射它们的对象之前绘制,并使用下面的第二个混合状态 gShadowBlendState。这使得它们只将它们的 alpha 值绘制到帧缓冲区上的 alpha 通道。

常规对象的精灵使用下面首先指定的 gBlendState,它只是一个常规的 alpha 混合到后缓冲区。但是,它们也会从后缓冲 Alpha 通道中移除 Alpha,使其不透明。这可以确保阴影不会通过它们前面的不透明对象显示出来。

绘制的第三件事是在其他所有内容之后绘制的,是使用阴影颜色和下面的最终混合状态进行渲染的全屏四边形。它使用 backbuffer 的 alpha 通道来实现不透明度,有效地带出之前记录的所有阴影信息。

这个练习的重点是让阴影在它们重叠的地方不会变暗。

    gBlendState.SrcBlend       = D3DBLEND_SRCALPHA;
    gBlendState.BlendOp        = D3DBLENDOP_ADD;
    gBlendState.DestBlend      = D3DBLEND_INVSRCALPHA;
    gBlendState.SrcBlendAlpha  = D3DBLEND_ZERO;
    gBlendState.BlendOpAlpha   = D3DBLENDOP_ADD;
    gBlendState.DestBlendAlpha = D3DBLEND_INVSRCALPHA;

    gShadowBlendState.SrcBlend       = D3DBLEND_ZERO;
    gShadowBlendState.BlendOp        = D3DBLENDOP_ADD;
    gShadowBlendState.DestBlend      = D3DBLEND_ONE;
    gShadowBlendState.SrcBlendAlpha  = D3DBLEND_ONE;
    gShadowBlendState.BlendOpAlpha   = D3DBLENDOP_MAX;
    gShadowBlendState.DestBlendAlpha = D3DBLEND_ONE;

    gShadowFillBlendState.SrcBlend       = D3DBLEND_DESTALPHA;
    gShadowFillBlendState.BlendOp        = D3DBLENDOP_ADD;
    gShadowFillBlendState.DestBlend      = D3DBLEND_INVDESTALPHA;
    gShadowFillBlendState.SrcBlendAlpha  = D3DBLEND_ONE;
    gShadowFillBlendState.BlendOpAlpha   = D3DBLENDOP_MAX;
    gShadowFillBlendState.DestBlendAlpha = D3DBLEND_ONE;

反正。我现在正在尝试在 Opengl 中执行此操作。目前我启用了 alpha 混合

    glEnable(GL_BLEND);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

但我不确定如何单独说明如何计算颜色和 alpha 分量。所以我的问题是:有没有办法比 glBlendFunc() 更好地控制 OpenGL 中的搅拌机?

4

3 回答 3

4

http://www.opengl.org/registry/specs/EXT/blend_func_separate.txt

于 2009-07-05T10:05:46.943 回答
1

我不确定您是否可以获得更好的控制,但是您应该能够通过使用 glColorMask 首先渲染颜色通道然后渲染 Alpha 通道来实现您想要做的大部分事情。最后一步似乎应该保持不变。

于 2009-07-03T10:45:13.990 回答
1

我在这里留下了答案:

http://pastie.org/542369

除了有一个问题:将所有 GL_ADD 替换为 GL_FUNC_ADD。我的错。

于 2009-07-11T15:03:17.530 回答