


[기본개념]
눈부심을 디스플레이로 나타내는 것은 힘들다. 그 이유로는 디스플레이가 방사할 수 있는 빛의 강도에 한계가 있고, 정밀도가 높은 미세한 색의 차이를 표현 할 수가 없기 때문이다. 그래서 눈부시게 보이는 듯한 연출을 추가 해야 한다. HDR은 매우 많은 연산을 요구 하기 때문에 사양을 고려해서 텍스쳐 포맷을 설정해야한다. HDR의 구현의 기본적인 개념은 프레임버퍼를 좀더 정밀도가 높은 HDR(High Dynamic Range)에 보관했다가, 디스플레이 출력시 이를 LDR(Low Dynamic Range)로 변경하여 출력하는 것이다. 즉 텍스쳐를 생성할 때 포맷에 차등을 둔다는 것이다.
[LDR 포맷과 HDR 포맷의 차이]
텍스쳐를 생성할 때의 품질은 다음과 같이 둔다.
LDR포맷 : D3DFMT_A8R8G8B8(32bit) - 정수.
HDR포맷 : D3DFMT_A16B16G16R16F(64bit), 3DFMT_A32B32G32R32F(128bit) - 부동소수점 정밀도.
여기서 서로의 정밀도가 다른데 이것은 픽셀셰이더에서 LDR포맷은 0~1값을 리턴하는 반면 HDR포멧은 1이상의 값을 린턴 할 수 있다는 말이다. 실제로 HDR과 LDR의 차이는 각각에 생성된 화면을 가공할때 나타나는데, 정확하게 말하면 10배를 확대한 후 다시 복원했을경우 LDR은 복원이 되지 않지만 HDR은 높은 정밀도를 바탕으로 복원이 가능하다는 것이다. 보충하자면 정밀도가 높은 텍스쳐는 확대가 될 경우 픽셀간의 보간의 정밀도 또한 높기 때문에 다시 축소하더라도 이전 상태를 유지 할 수 있다. HDR은 상황에 따라서 LDR과 HDR의 포맷의 차등을 두게된다. 그런데 요즘은 평균적으로 사용하는 하드웨어가(VGA의 최소사양) 좋아진면도 있고, 대부분의 포스트 이펙트 효과는 퀄리티와 속도상의 타협점을 찾아서 올리는 거나 옵션으로 사용자가 직접 선택할 수 있도록 하는 것이 보통이기 때문에 말그되로 상황에 따라 틀려지게 된다.
[텍스쳐]
총 5가지의 텍스쳐를 사용하게 된다.
1. PDIRECT3DTEXTURE9 m_pTexScene; //HDR포맷 : 원본화면
2. PDIRECT3DTEXTURE9 m_pTexHDRneScaled; //LDR포맷 : (원본화면의 1/4) 축소버퍼 텍스쳐
3. PDIRECT3DTEXTURE9 m_pTexBrightPass; //LDR포맷 : (원본화면의 1/4) 밝은부분(휘도)을 추출 텍스쳐
4. PDIRECT3DTEXTURE9 m_pTexStarSource; //LDR포맷 : (원본화면의 1/4) 추출된 휘도를 부드럽게 만들기 위한 필터 텍스쳐
5. PDIRECT3DTEXTURE9 m_apTexStar; //LDR포맷 : (원본화면의 1/4) 해당하는 방향(모양)으로 늘리기위한 텍스쳐
1024*768 해상도에서의 샘플링을 할경우 결과상 차이가 거의 나지 않아서 상동과 같이 HDR포맷과 LDR포맷을 나누었다. 역시 책에서 말한것 처럼 추출할때의 정밀도가 중요한 것 같다.
[렌더링순서]
1. m_pTexScene에 HDR을 먹일 매쉬를 렌더링 시킨다.
2. m_pTexSceneScaled에 m_pTexScene을 4분의1로 축소하여 렌더링시킨다.(m_pTexScene의 4by4에 해당하는 16픽셀의 평균을 구하여 렌더링시킨다)
3. m_pTexSceneScaled 밝은 부분 추출
4. m_pTexStarSource 계단현상을 줄이기 위해서 뭉개는 필터링 적용
5. m_apTexStar 원하는 방향으로 늘린다
매쉬 렌더링 -> 축소 버퍼 저장 -> 밝은 휘도 추출 -> 뭉개는 필터링 적용 -> 텍스쳐 늘리기 ->원본화면과 블랜딩
[References]
DirectX9 셰이더 프로그래밍 / 타카시 이마기레





덧글