2014-09-06 107 views
0

我試圖教自己陰影映射到它融入我的比賽,我目前使用本教程(不軟着色器現在):陰影映射問題與DirectX9和HLSL

http://www.gamedev.net/page/resources/_/technical/graphics-programming-and-theory/soft-edged-shadows-r2193

我已經成功地將大部分代碼實施到了我的遊戲中。我可以創建爲陰影貼圖創建深度緩衝區所需的矩陣,並將其渲染,以便我知道它看起來正確。然後我將它輸入到最終的渲染循環中,這就是我遇到問題的地方。我似乎無法正確實施最終的矩陣計算,或者我一直在做一些錯誤的事情。我基本上距離這個工作只有一步之遙,但是我的矩陣計算似乎並不正確,我希望是這樣,而不是實現的另一部分。

這裏是初始化代碼(在這裏沒有已知的問題): (爲了簡化刪除)

這裏是初始化代碼設置爲深度緩衝渲染(這裏沒有已知的問題): (除去簡化)

所有這些代碼成功創建深度圖,並把它變成g_pShadowMap

這裏是用來渲染深度圖(這裏沒有已知的問題)的HLSL代碼: (爲了簡化刪除)

我將深度圖的圖像保存到文件中並查看它,因爲值爲0.5或更大,圖像是白色的,但是如果我將深度值除以100,則可以更精確地看到深度圖像,並且它正確地呈現從角色上方20個單位開始的自上而下的光源,按照計劃面向+ x方向。我不確定存儲在地圖中的z距離是否需要一定的比例尺,但是,除非我將z值除以100以查看我的「藍色」深度圖,否則該圖像爲白色。 (我不使用分割的值作爲我的最終圖像)。

下面是最後的代碼渲染我的地形(這是那裏最有可能有問題):

// Restore the render target and depth buffer 
g_pd3dDevice->SetRenderTarget(0, g_pOldColorRT); 
g_pd3dDevice->SetDepthStencilSurface(g_pOldDepthRT); 
SAFE_RELEASE(g_pOldColorRT); 
SAFE_RELEASE(g_pOldDepthRT); 

// Compute the texture matrix 
float fTexOffs = 0.5 + (0.5/(float)VGlobal::SHADOW_MAP_SIZE); 
D3DXMATRIX matTexAdj(0.5f,  0.0f, 0.0f, 0.0f, 
          0.0f, -0.5f, 0.0f, 0.0f, 
          0.0f,  0.0f, 1.0f, 0.0f, 
          fTexOffs, fTexOffs, 0.0f, 1.0f); 

D3DXMATRIX matTexture = matLightViewProj * matTexAdj; 
g_pEffect->SetMatrix("g_matTexture", &matTexture); 
g_pEffect->SetTexture("tShadowMap", g_pShadowMap); 

// Begin the scene 
// g_pd3dDevice->BeginScene(); 

// Setup the world, view, and projection matrices 
SetupMatrices(); 

// Extract the 6 Viewing Frustrum planes for culling calculations 
D3DXMATRIX tWorld, tView, tProj, tFinal; 
g_pd3dDevice->GetTransform(D3DTS_PROJECTION, &tProj); 
g_pd3dDevice->GetTransform(D3DTS_VIEW, &tView); 
D3DXMatrixMultiply(&tFinal, &tView, &tProj); 
gFrustrum.ExtractPlanesD3D(gFrustrum.frPlanes, tFinal, true); 


D3DXMATRIX tempMat = matInfo.ReturnWorld() * matInfo.ReturnView() * matInfo.ReturnProj(); 
D3DXMatrixTranspose(&tempMat, &tempMat); 

g_pEffect->SetMatrix("worldViewProj", &tempMat); 
g_pEffect->SetTechnique("Technique0"); 

//The main render code continues from here, and renders the non-shaded aspects correctly 

現在到了最後的HLSL渲染代碼,我假設我不處理陰影圖的矩陣正確...

fragment TerrainVS(vertex IN) 
{ 
    fragment OUT; 

    OUT.hposition = mul(worldViewProj, float4(IN.position, 1)); 

    //Removed non-relevant code (textures/color calculation) 
    //... 

    //Shadow mapping 
    // Output the projective texture coordinates 
    OUT.vProjCoord = mul(g_matTexture, float4(IN.position, 1)); 

return OUT; 
} 

pixel TerrainPS(fragment IN) 
{ 
    pixel OUT; 

    //Removed non-relevant code (normal/lighting/color calculations) 
    //... 

    // Grab the shadow term 
    float fShadowTerm = 0.0f; 
    fShadowTerm = tex2Dproj(ShadowSampler, IN.vProjCoord) < (IN.vProjCoord.z - 0.001f) ? 0.1f : 1.0f; 


    OUT.color = max(normColor1, normColor2) * fShadowTerm; 

    OUT.color.a = 1.0f; 

    return OUT; 
} 

任何幫助將不勝感激。我只能假設我沒有正確計算陰影貼圖上的矩陣。這個例子使用LH投影,而我使用RH投影。此外,由於我已經設置了我的遊戲矩陣,因此我沒有使用示例的D3DXMatrixOrthoLH()調用來計算我的最終matLightViewProj,我不確定是否需要。我相信我已經發布了這個問題的所有相關代碼。再次,我將不勝感激任何幫助,它已經困擾了我好幾天了。

+0

是否有可能修剪這個龐大的代碼示例,所以[只有產生錯誤的部分](http://sscce.org/),你所描述的是在這個問題中? – APerson 2014-09-06 00:16:05

+0

@APerson當然,我只是想確保我發佈了任何相關的代碼,以防萬一我錯過了某些東西,但是如果我在這裏提供了太多的信息,我會刪除它。 – Carradine 2014-09-06 01:11:11

回答

0

我已經找到了答案,顯然是我需要扭轉我的位置的乘法和修改光矩陣,使用代碼OUT.vProjCoord = mul(float4(IN.position, 1), g_matTexture);

這讓我感到困惑,因爲我乘它以相反的順序進行的正常渲染現場。