2009-07-02 86 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_添加來添加。我的錯。