2009-07-02 84 views
1

在试图将我的2D阴影渲染技术从Directx移植到Opengl的过程中,我遇到了一个问题,我似乎无法获得足够的访问opengl搅拌器的权限。如何分开opengl中的颜色和alpha混合函数?

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

我排序,并从后到前渲染所有的精灵,而无需使用深度缓冲。在投影它们的对象之前绘制Shadow Sprites,并使用下面的第二个blendstate 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中做到这一点。目前,我有

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

启用alpha混合,但我不知道如何给它一个如何计算的颜色和alpha分量单独的指令。所以我的问题是:有没有办法在OpenGL中比glBlendFunc()更好地控制搅拌机?

回答

1

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

+0

谢谢埃里克,这看起来像解决问题的另一种方式。我并不热衷于渲染几何图形,但这是隔离我没有考虑过的alpha通道的一种方法。 – Cheesington 2009-07-09 22:43:18

1

我在这里留下了答案:

http://pastie.org/542369

除了有一个问题:更换所有的GL_与GL_ FUNC_添加来添加。我的错。