如何在opengl中分离颜色和alpha混合函数?

时间:2009-07-02 23:10:09

标签: opengl directx alpha

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

但首先,以下是有道理的,我的算法:

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

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

绘制的第三件事,是在其他所有内容之后绘制的,是一个全屏四边形,使用阴影颜色和下面的最终混合状态渲染。它使用后备缓冲区的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组件。所以我的问题是:有没有办法在OpenGL中更好地控制混合器而不仅仅是glBlendFunc()?

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我在这里留下了答案:

http://pastie.org/542369

除了一个问题:用GL_ FUNC_ ADD替换所有GL_ ADD。我的错误。