在试图将我的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()更好地控制搅拌机?
谢谢,Goz,这是我所追求的。任何想法除了基本的添加之外如何获得D3DBLENDOP_MAX操作? – Cheesington 2009-07-09 22:45:09