본문 바로가기

그래픽스

[그래픽스] HDRI(High Dynamic Range Image)

HDRI는 일반적으로 허용하는 범위보다 더 넓은 범위를 처리할 수 있는 이미지이다.

기존 이미지의 픽셀 포맷은 R8G8B8A8_UNORM을 사용해서 0~1 사이의 실수로 표현했다.

HDRI의 픽셀 포맷은 R16G16B16A16_FLOAT이다. UNORM처럼 0~1 사이의 범위로 제한되지 않고

더 넓은 범위로 표현이 가능하다. 그래서 High Dynamic Range인 것이다. 

 

HDRI를 렌더링하기 위해 SwapChain의 픽셀포맷을 R16G16B16A16_FLOAT로 하고 SwapChain과 

백버퍼의 픽셀 포맷이 동일하므로 백버퍼를 ResolveSubResource할 때 포맷을 맞춰줘야 한다.

 

그리고 HDRI를 읽을 때 기존의 32비트짜리 float이 아닌 16비트짜리 float을 사용한다. 이것을

half-precision float라고 한다. C++에는 이것이 없기 때문에 디버깅하려면 32비트로 바꿔서 해야 한다.

이 때 fp16라이브러리를 사용해야 한다. 

 

    vector<float> f32(image.size() / 2);
    uint16_t *f16 = (uint16_t *)image.data();
    for (int i = 0; i < image.size() / 2; i++) {
        f32[i] = fp16_ieee_to_fp32_value(f16[i]);

 

fp16_ieee_to_fp32_value함수로 HDRI의 데이터를 16비트에서 32비트로 변환한 후 디버깅할 때 데이터를 확인할 수 있다.

uint16 데이터를 넣어주는 이유는 uint를 쓰겠다는 것이 아니라 16비트단위로 메모리를 넣어주겠다는 뜻이다.

'그래픽스' 카테고리의 다른 글

[그래픽스] 렌더링 엔진 구조 변경  (0) 2023.07.23
[그래픽스] HDR 파이프라인  (0) 2023.07.22
[그래픽스] Height Map  (0) 2023.07.21
[그래픽스] Normal Mapping  (0) 2023.07.21
[그래픽스] Mipmap, LOD  (0) 2023.07.21