在試圖將我的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