Skip to content

HDR 렌더링(9)~HDR 텍스처

[칼럼 핵심 요약]
HDR 텍스처도 DirectX 9세대/SM3.0 대응 이후의 GPU라면 보통 부동소수점(Floating-Point) 텍스처를 활용하면 문제는 없다. DirectX 10세대/SM4.0 대응 GPU가 아니면 FP32-128 비트 텍스처에의 필터링은 할 수 없지만, 일반적인 3D 그래픽스의 렌더링으로 지금까지의 HDR 텍스처를 필요로 하는 국면은 적을 것이다.

🌐 원문 링크: HDRレンダリング(9)~HDRテクスチャ (Mynavi News)
📅 원문 발행일: 2009-02-07 | ✍️ 저자: 西川善司 (니시카와 젠지 / Zenji Nishikawa)

NOTE

💡 현대 그래픽스 관점에서의 발전사 (Modern Retrospective)

  • HDR 디스플레이 하드웨어 보급: 본문 연재 당시(2008~2009년)에는 SDR 모니터 출력을 위해 FP16 버퍼를 톤 매핑하는 것이 목적이었으나, 현재는 1000nit 이상의 OLED/Mini-LED HDR 디스플레이가 대중화되어 ACES(Academy Color Encoding System) 기반의 광색역 HDR10 출력이 표준화되었습니다.
  • 노출 적응 및 물리 기반 카메라: 현대 게임 엔진은 실제 카메라의 셔터 스피드, 조리개(f-stop), ISO 감도를 그대로 모사하는 물리 기반 노출(Physical Camera Exposure) 모델을 사용합니다.

📖 본문 해설

[원문 리드문] > HDR 텍스처도 DirectX 9세대/SM3.0 대응 이후의 GPU라면 보통 부동소수점(Floating-Point) 텍스처를 활용하면 문제는 없다. DirectX 10세대/SM4.0 대응 GPU가 아니면 FP32-128 비트 텍스처에의 필터링은 할 수 없지만, 일반적인 3D 그래픽스의 렌더링으로 지금까지의 HDR 텍스처를 필요로 하는 국면은 적을 것이다.

지금도 의사 HDR 텍스처와 병용하는 것이 주류

HDR 텍스처도 DirectX 9세대/SM3.0 대응 이후의 GPU라면 보통 부동소수점(Floating-Point) 텍스처를 활용하면 문제는 없다. FP16-64비트 텍스처라면 텍스처 필터링도 바이리니어에서 이방성까지 모든 것을 적용할 수 있다. DirectX 10세대/SM4.0 대응 GPU가 아니면 FP32-128 비트 텍스처에의 필터링은 할 수 없지만, 일반적인 3D 그래픽스의 렌더링으로 지금까지의 HDR 텍스처를 필요로 하는 국면은 적을 것이다.

그러나 FP16-64비트 텍스처의 범용성 그 자체는 높지만 큰 문제도 있다. 그것은 비디오 메모리의 점유량과 읽고 때의 대역 소비가 크다고 하는 것이다(렌더 타겟의 때와 같은 문제).

αRGB 각 8비트의 int8-32비트의 종래의 LDR 텍스처이면, DXTC(DirectX Texture Compression)라고 불리는 텍스처 압축 방법을 이용할 수 있다. DXTC로 압축된 텍스처는 압축된 상태인 채 GPU 코어가 직접 액세스할 수 있기 때문에 활용하면 상당히 비디오 메모리에 기여할 수 있습니다. 그러나, 부동소수점(Floating-Point)의 HDR 텍스처가 되면, 최신의 DirectX 10세대/SM4.0 대응 GPU이어도, 그 압축 메소드는 서포트되고 있지 않다.

3D 게임 그래픽에서 모든 텍스처를 HDR 텍스처로 충당하기 위해서는 비디오 메모리 예산, 대역 예산이 너무 엄격하기 때문에 DirectX 9세대/DirectX 10세대에서도 LDR 텍스처를 의사 HDR 텍스처로 활용하는 경우가 많은 것 같다.

의사 HDR 텍스처는 포맷으로서는 LDR 텍스처이므로 DXTC를 효과적으로 압축할 수 있다.

포인트가 되는 것은, 어떻게 LDR 텍스처에 HDR 정보를 격납하는지인데, 이것에 대해서는 다양한 테크닉이 고안되고 있다.

여기에서는 「로스트 플래닛」(캡콤, 2007)에서 채용된 방법을 소개하자.

이 방법으로 사용하는 것은 α값과 RGB 모두가 1/4의 압축되는 DXT5 모드의 DXTC이다.

HDR에서 LDR로의 변환 (인코딩)은 먼저 {R, G, B, 1.0} 중 최대 값 M을 선택하고 그 역수 1 / M을 α에 저장한다. 계속해서 {R, G, B}의 모두를 M으로 나눈 것을 RGB에 격납한다.

되돌리는 디코드 처리는 {R, G, B} = {R, G, B} ÷ α만으로 구해진다.

이것으로, 분해능은 저하해 버리지만, HDR의 다이나믹 레인지는 유지되어 그 나름대로 RGB의 칼라도 유지됩니다.

HDR 텍스처라도, 고휘도인 HDR값의 텍셀보다는, RGB가 0.0~1.0의 LDR치의 텍셀이 많을 것이다. 이 방법은, 그 계산 알고리즘의 특성상, 그 대부분을 차지할 LDR값의 텍셀의 유지 품질이 높아지는 것이 특징이다.

또한 인코딩하면 HDR 값으로 돌아가므로 FP16-64 비트 HDR 텍스처와의 혼용도 쉽다고 할 수 있다. 게다가, 이 방법은, 고압축률인 DXT1로 압축한 LDR 텍스처를 동일 쉐이더로 취급할 수 있다는 장점도 있다.

DXT1은 α=0 또는 α=1 중 하나에서만 이용할 수 있지만, α=1로서 LDR 텍스처를 DXT1로 압축해 두면, 방금전의 DXT5의 의사 HDR 텍스쳐를 {R,G,B}={R,G,B}÷α로 디코딩 처리해도 {R,G,B}={R,G,B}÷1 (계속)

HDR 텍스처를 의사 HDR 텍스처로 LDR 텍스처로 변환. 나름의 품질로 좋다고 하는 HDR 텍스처는, 이것으로 이용하면 DXT 압축이 효과가 있다HDR 텍스처를 의사 HDR 텍스처로 LDR 텍스처로 변환. 나름의 품질로 좋다고 하는 HDR 텍스처는, 이것으로 이용하면 DXT 압축이 효과가 있다

(트라이Z 니시카와 젠지)


🔗 연관 지식 베이스 (Wiki)

Based on Zenji Nishikawa's 3D Graphics Maniax series. Translated & Knowledge-Based for Korean Game Developers.