Проблема с отображением теней в 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, я предполагаю, что я не имею дело с матрицей Shadow Map правильно …

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;
}

Любая помощь будет принята с благодарностью. Я могу только предположить, что я неправильно вычисляю матрицу на Shadow Map. В примере используется проекция LH, в то время как я использую проекции RH. Кроме того, так как у меня уже были настроены матрицы моей игры, я не использовал примеры D3DXMatrixOrthoLH() позвоните, чтобы рассчитать мой финал matLightViewProj и я не уверен, если мне нужно. Я полагаю, что выложил все соответствующие коды для этой проблемы. Опять же, я был бы очень признателен за любую помощь, вот уже несколько дней она озадачивает меня

0

Решение

Я нашел ответ, по-видимому, мне нужно было изменить свое умножение положения и модифицированную световую матрицу, используя код OUT.vProjCoord = mul( float4(IN.position, 1), g_matTexture );

Это смутило меня, так как я умножил это в обратном порядке для нормального рендеринга сцены.

0

Другие решения


По вопросам рекламы [email protected]