[DirectX 11] Shadow Map

2021. 12. 14. 04:08·Graphics

Shadow Map

기존 오브젝트 Rendering을 하기 전 Pass에서 Camera 기준이 아닌 Directional Light 기준 View, Projection을 이용하여 투영해서 Depth를 찍어둔 후 바인딩된 ShaderResourceView를 참조하여 Lighting 연산.

 

광원 기준 보이는 영역

위 그림에서 파란색 선이 현재 광원 기준에서 바라볼때 보이는 영역이다.

검은색 선으로 표시된 부분이 즉 광원기준에서 바라본 오브젝트가 투영된 Shadow 영역.

 

Shadow 연산 방식

왼쪽 그림은 오브젝트 아래 표면에 그림자가 생기는 방향성 광원을 보여준다. 깊이 맵에 저장된 깊이 값을 사용하여 가장 가까운 지점을 찾고 이를 사용하여 현재 영역이 그림자 영역 안에 있는지 여부를 결정하고, 해당 광원에 특정한 보기 및 투영 행렬을 사용하여 깊이 맵을 만든 후 해당 깊이 맵을 참조하여 최종 광원 연산을 한다.

 

현재 적용된 Shadow는 영역을 지정하여 그려야 한다는 단점이 있는데 추후에 변경해야 할 것 같다.

 

Light 기준 Depth

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 연산.

 

Shadow Map 적용

'Graphics' 카테고리의 다른 글

[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
'Graphics' 카테고리의 다른 글
  • [DirectX 11] Normal Mapping
  • [DirectX 11] Gamma Correction
  • [DirectX 11] Deferred Rendering GBuffer
  • [DirectX 11] Screen Space Ambient Occlusion
KyuHwang
KyuHwang
  • KyuHwang
    DirectX Engine
    KyuHwang
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • C++ (4)
      • CS (0)
      • Graphics (32)
      • DLL (2)
      • Shader (7)
      • Project (4)
      • ETC (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • YouTube
  • 공지사항

  • 인기 글

  • 태그

    Return Type Operator
    Directx11
    nvtt
    Project
    animation constraint
    std::is_base_of
    dll
    DLL Interface
    bc format
    Win API
    hlsl
    rigging chain
    mobile format
    Shader Resource 관리
    Alpha Blending
    DirectX 2D
    animation retargeting
    RunTime Compile Shader
    texture block compression
    Implicit Linking
    C ++
    Hash Code
    Define Macro
    std::enable_if
    Order Independent Transparency
    Shader Macro
    shader
    Define Function
    Explicit Linking
    Shader Reflection
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
KyuHwang
[DirectX 11] Shadow Map
상단으로

티스토리툴바