2014-09-06 102 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);

这让我感到困惑,因为我乘它以相反的顺序进行的正常渲染现场。