我正在尝试自学影子映射以将其集成到我的游戏中,我目前正在使用本教程(目前没有软着色器):
我已成功将大部分代码应用到游戏中。我可以形成为阴影贴图创建深度缓冲区所需的矩阵,并让它渲染,所以我知道它看起来是正确的。然后我将其输入到最终的渲染循环中,这就是我遇到问题的地方。我似乎无法正确实现最终的矩阵计算,或者我一直做错了。我基本上离这个工作只有一步之遥,但是我的矩阵计算似乎不正确,我希望情况就是这样,并且它不是实现的另一部分。
这是初始化代码(这里没有已知问题): (为简化而删除)
这是为深度缓冲区渲染设置的初始化代码(这里没有已知问题): (为简化而删除)
所有这些代码都成功创建了深度图并将其放入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 :(得分:0)
我找到了答案,显然我需要使用代码OUT.vProjCoord = mul( float4(IN.position, 1), g_matTexture );
它使我感到困惑,因为我以相反的顺序将它乘以场景的正常渲染。