Shadow Map
기존 오브젝트 Rendering을 하기 전 Pass에서 Camera 기준이 아닌 Directional Light 기준 View, Projection을 이용하여 투영해서 Depth를 찍어둔 후 바인딩된 ShaderResourceView를 참조하여 Lighting 연산.
위 그림에서 파란색 선이 현재 광원 기준에서 바라볼때 보이는 영역이다.
검은색 선으로 표시된 부분이 즉 광원기준에서 바라본 오브젝트가 투영된 Shadow 영역.
왼쪽 그림은 오브젝트 아래 표면에 그림자가 생기는 방향성 광원을 보여준다. 깊이 맵에 저장된 깊이 값을 사용하여 가장 가까운 지점을 찾고 이를 사용하여 현재 영역이 그림자 영역 안에 있는지 여부를 결정하고, 해당 광원에 특정한 보기 및 투영 행렬을 사용하여 깊이 맵을 만든 후 해당 깊이 맵을 참조하여 최종 광원 연산을 한다.
현재 적용된 Shadow는 영역을 지정하여 그려야 한다는 단점이 있는데 추후에 변경해야 할 것 같다.
Light 기준 View Projection을 기반으로 Rendering한 Depth Buffer.
g_Context->OMSetBlendState(0, 0, 0xffffffff);
g_Context->RSSetViewports(1, m_ShadowViewport);
// 그리기만 할 것이므로 null Render Target 설정..
// 깊이 버퍼, null Rendering 대상을 설정하면 색상 쓰기가 비활성화 된다..
g_Context->OMSetRenderTargets(0, nullptr, m_ShadowDSV);
g_Context->ClearDepthStencilView(m_ShadowDSV, D3D11_CLEAR_DEPTH, 1.0f, 0);
g_Context->RSSetState(m_RasterizerState);
Shadow Map을 그리기 위한 설정.
해당 Depth만 찍을경우 RenderTarget은 바인딩할 필요가 없다.
// 현재 픽셀의 Shadow 값..
float shadows = 1.0f;
#ifdef SHADOW
shadows = CalcShadowFactor(gSamBorderComparisonLinearPoint, gShadowMap, float3(shadow.xyz));
#endif
// Directional Light
ComputeDirectionalLight(gMaterials[matID], gDirLights, float3(normal.xyz), ViewDirection,
A, D, S);
ambient += A;
diffuse += shadows * D;
spec += shadows * S;
Pixel Shader 연산 과정.
Shadow Map을 참조하여 최종 Light 연산.
'DirectX 11' 카테고리의 다른 글
[DirectX 11] Skinning Mesh (0) | 2021.12.18 |
---|---|
[DirectX 11] Normal Mapping (0) | 2021.12.18 |
[DirectX 11] Gamma Correction (0) | 2021.12.18 |
[DirectX 11] Deferred Rendering GBuffer (0) | 2021.12.14 |
[DirectX 11] Screen Space Ambient Occlusion (0) | 2021.12.14 |