Я пытаюсь научить себя отображению теней, чтобы интегрировать его в свою игру, и в настоящее время я использую этот урок (пока без мягких шейдеров):
Я успешно внедрил большую часть кода в мою игру. Я могу сформировать матрицу, необходимую для создания буфера глубины для карты теней, и сделать так, чтобы она выглядела правильно. Затем я ввожу это в последний цикл рендеринга, и именно здесь я столкнулся со своими проблемами. Кажется, я не могу правильно выполнить окончательный расчет матрицы, или я сделал что-то не так на этом пути. Надеюсь, я в одном шаге от этой работы, но мои матричные вычисления, похоже, не верны, я надеюсь, что это так, и это не то, что находится в другой части реализации.
Вот код инициализации (здесь нет известных проблем):
(снято для упрощения)
Вот код инициализации для настройки рендера буфера глубины (здесь нет известных проблем):
(снято для упрощения)
Весь этот код успешно создал карту глубины и помещает ее в 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
и я не уверен, если мне нужно. Я полагаю, что выложил все соответствующие коды для этой проблемы. Опять же, я был бы очень признателен за любую помощь, вот уже несколько дней она озадачивает меня
Я нашел ответ, по-видимому, мне нужно было изменить свое умножение положения и модифицированную световую матрицу, используя код OUT.vProjCoord = mul( float4(IN.position, 1), g_matTexture );
Это смутило меня, так как я умножил это в обратном порядке для нормального рендеринга сцены.