0

シャドウ マッピングを自分のゲームに統合する方法を独学で学ぼうとしています。現在、このチュートリアルを使用しています (今のところソフト シェーダーは使用していません)。

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んでした。必要かどうかもわかりません。この問題に関連するすべてのコードを投稿したと思います。繰り返しになりますが、助けていただければ幸いです。ここ数日間、私は困惑しています。

4

1 に答える 1