2011-05-05 87 views
0

我目前正在嘗試在direct3d 9中的場景上繪製陰影。我試圖做一些多遍渲染,並且無法理解如何使用/設置混合模式。Direct3D 9陰影貼圖混合模式

我已經做了深度傳遞,填充深度緩衝區,然後我有一個循環遍歷場景中的所有燈光。內環路我有2個環,其通過場景中的所有形狀都環

我有這種設置

for(number of shapes) 
{ 
    //render from camera position and fill depth buffer 
} 
for(number of lights) 
{ 
    for(number of shapes) 
    { 
    //render to shadow map 
    } 
    for(number of shapes) 
    { 
    //render to screen 
    } 
} 

在PIX我可以看到,它遍歷每個光,但是當我運行它只顯示燈光陣列中的最後一盞燈。我認爲這與混合模式有關。

我查看了混合模式並找到了關於源和目標混合的信息。這是我需要/有人可以幫忙解釋一下嗎?

由於提前,

馬克

[編輯] 我有兩個指示燈可見使用下面的代碼

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); 
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); 

陰影看起來不正確的,但我越來越近達到預期的結果。

任何更多的建議將是巨大的,

感謝,

馬克

回答

1

我也認爲你錯了alpha混合狀態設置。我假設你做了一個SRC混合,並用新的替換你的舊圖像,而不是做任何alpha混合。 你需要考慮你想要什麼。我假設你想要一個SRC_OVER混合。
Porter Duff規則可以給你一個提示,並且它們很容易在directX中實現。例如看here
[編輯]我應該仔細閱讀。

Alpha混合和像素着色器是獨立的。所以你當然可以使用像素着色器來改變你的源的顏色值。也許增加一些特殊效果或者你想嘗試的東西。 但是,只要希望將源代碼混合到目標中,並且不想用新代碼替換所有像素,則需要啓用Alpha混合。例如。這樣

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 

此代碼將相乘的所有源像素與它們的α值,並用1-source_alpha所有目標像素。並將它們結合到新的目的地。

+0

我沒有使用固定功能管道。我目前有3套着色器。第一盤用於深度傳球。第二組用於輸出燈光位置和第三組場景的深度,以使用陰影貼圖紋理深度來渲染場景中的陰影。我認爲問題在於傳球之間的混合。 – MulletDevil 2011-05-05 12:13:25

+0

我假設目標是渲染目標?什麼是來源/你如何設置它? – MulletDevil 2011-05-05 14:57:43

+0

目標是渲染目標,源代碼是您設置爲混合的紋理的顏色。 – mkaes 2011-05-06 08:16:23