[DirectX 11] Tone Mapping

2022. 2. 3. 22:13·Graphics

LDR ( Low Dynamic Range ) / HDR ( High Dynamic Range ) / Tone Mapping

 

- LDR : 기존의 색상 표현은 색상당 8bit 으로 표현해왔다. 하지만 Light 연산을 통해 출력을 할 경우 해당 Color가 1.0을 넘는

              경우가 있는데 출력시에 [0.0, 1.0] 까지만 표현이 가능하다.

- HDR : 조금 더 넓은 범위의 Color를 표현하기 위해 장면의 고휘도 값을 Rendering Pipeline 전체에 유지하고, 그 결과를

               디스플레이 장치에 출력할 수 있는 범위로 압축하는 방식이다.

- Tone Mapping : Shader 내에서는 HDR로 계산을하고 Rendering시에는 LDR로 변환을 해주는 것이다. 즉, HDR 결과를

                                   디스플레이 출력이 가능한 적합한 휘도 범위로 변환해주는 처리이다.

 

HDR 장점

- 음영이 보다 현실감이 있게 표현 할 수 있다.

- 노출 보정을 할 수 있다. (어두운 공간에서 갑작스럽게 밝은 공간으로 갔을경우 적응하는데 시간이 걸리는 현상)

- 눈부심 표현이 가능하다. (Bloom, Glare, Glow)

 

Tone Mapping 방식

- 화면의 평균 휘도를 구한다.

- 평균 휘도를 키값으로 하여, 표시 가능한 LDR 색상으로 맵핑한다.

- 매번 처리를 해주는 것이 아니라 최종 출력물의 후처리로 해준다.

 

LDR / HDR 비교

 


	// LDR RenderTarget
	D3D11_TEXTURE2D_DESC texDesc;
	texDesc.Width = width;
	texDesc.Height = height;
	texDesc.MipLevels = 1;
	texDesc.ArraySize = 1;
	texDesc.SampleDesc.Count = 1;
	texDesc.SampleDesc.Quality = 0;
	texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
	texDesc.Usage = D3D11_USAGE_DEFAULT;
	texDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
	texDesc.CPUAccessFlags = 0;
	texDesc.MiscFlags = 0;
    
	// HDR RenderTarget
	D3D11_TEXTURE2D_DESC texDesc;
	texDesc.Width = width;
	texDesc.Height = height;
	texDesc.MipLevels = 1;
	texDesc.ArraySize = 1;
	texDesc.SampleDesc.Count = 1;
	texDesc.SampleDesc.Quality = 0;
	texDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;	// 색상당 326bit 부동 소수점
	texDesc.Usage = D3D11_USAGE_DEFAULT;
	texDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
	texDesc.CPUAccessFlags = 0;
	texDesc.MiscFlags = 0;

- LDR 출력에서 HDR 출력으로 변경시 주의할 점은 출력시 채널별 8bit Format이 아닌 32bit 부동 소수점으로 출력을하여

   Tone Mapping을 해주어야 하는점을 주의해야 할 것이다.

- 32bit 부동 소수점으로 출력 해논 RenderTarget을 기반으로 Tone Mapping을 통해 [0.0, 1.0] 범위의 값으로 압축하여

   디스플레이에 출력하면 된다.

 

float3 Multiply(const float3 m[3], const float3 v)
{
    float x = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2];
    float y = m[1][0] * v[1] + m[1][1] * v[1] + m[1][2] * v[2];
    float z = m[2][0] * v[1] + m[2][1] * v[1] + m[2][2] * v[2];
    return float3(x, y, z);
}

float3 rtt_and_odt_fit(float3 v)
{
    float3 a = v * (v + 0.0245786f) - 0.000090537f;
    float3 b = v * (0.983729f * v + 0.4329510f) + 0.238081f;
    return a / b;
}

// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT
static float3 aces_input_matrix[3] = { float3(0.59719f, 0.35458f, 0.04823f), float3(0.07600f, 0.90834f, 0.01566f), float3(0.02840f, 0.13383f, 0.83777f) };
// ODT_SAT => XYZ => D60_2_D65 => sRGB
static float3 aces_output_matrix[3] = { float3(1.60475f, -0.53108f, -0.07367f), float3(-0.10208f, 1.10813f, -0.00605f), float3(-0.00327f, -0.07276f, 1.07602f) };

float3 ACESToneMapping(float3 colorIn)
{
    colorIn = Multiply(aces_input_matrix, colorIn);
    colorIn = rtt_and_odt_fit(colorIn);
    colorIn = Multiply(aces_output_matrix, colorIn);
    
    return saturate(colorIn);
}

- 최종 출력 전 ToneMapping을 통해 HDR 범위에서 LDR 범위로 압축하여 출력해주면 된다.

저작자표시 (새창열림)

'Graphics' 카테고리의 다른 글

[DirectX 11] Bloom  (1) 2022.02.17
[DirectX 11] Lambert / Half Lambert  (0) 2022.02.07
[DirectX 11] IBL (Image Based Lighting)  (5) 2022.01.23
[DirectX 11] PBR (Physically Based Rendering)  (0) 2022.01.21
[DirectX 11] Deferred Rendering FXAA  (0) 2022.01.16
'Graphics' 카테고리의 다른 글
  • [DirectX 11] Bloom
  • [DirectX 11] Lambert / Half Lambert
  • [DirectX 11] IBL (Image Based Lighting)
  • [DirectX 11] PBR (Physically Based Rendering)
KyuHwang
KyuHwang
  • KyuHwang
    DirectX Engine
    KyuHwang
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • C++ (4)
      • CS (0)
      • Graphics (32)
      • DLL (2)
      • Shader (7)
      • Project (4)
      • ETC (1)
  • 블로그 메뉴

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

    • YouTube
  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바