DirectX Graphics 프로그래밍 가이드 고도의 주제 프레임 버퍼 감마   [목차열람] [주소복사] [슬롯비우기]
감마
 
Microsoft DirectX 9.0

감마


텍스처 컨텐츠는 sRGB 포맷으로 보존하는 것이 많다. 이 포맷의 더 자세한 정보는,http://www.srgb.com  World Wide Web 링크 를 참조할것. 종래, 픽셀 파이프라인에서는, 색은 선형이다라는 전제에 근거해, 혼합 처리를 선형 공간으로 실행하고 있었다. 그러나,sRGB 컨텐츠는 감마 보정 되고 있기 (위해)때문에, 선형 공간으로 혼합 처리를 실시하면 올바른 결과를 얻을 수 없다. 현재는, 비디오 카드로,sRGB 컨텐츠를 읽어들일 때 감마 보정을 바탕으로 되돌리는 것에 의해 이 문제를 수정해, 픽셀을 써낼 때 픽셀 데이터를 sRGB 포맷으로 변환할 수 있다. 이 경우, 픽셀 파이프라인내에서의 처리는 모두 선형 공간으로 행해진다.

감마 보정

Microsoft® DirectX® 9.0 에서는 다음 일이 가능하다.

그 외의 모든 색 (클리어 컬러, 머트리얼 컬러, 정점색등)은 선형 공간에 있다고 가정한다. 애플리케이션은, 픽셀 셰이더의 명령을 사용해, frame buffer에 기입해진 색을 감마 보정 할 수 있다. 선형화는 RGB 채널인 만큼 적용해, 알파 채널에는 적용하지 않는 것.

모든 표면 포맷을 선형화 할 수 있는 것은 아니다. 선형화 할 수 있는 것은, D3DUSAGE_SRGBREAD 을 사용해 IDirect3D9::CheckDeviceFormat 를 건네주는 포맷 뿐이다. 그 외의 포맷에서는, 샘플러 스테이트 D3DSAMP_SRGBTEXTURE 는 무시된다. 보통, 이 변환을 지원 하고 있는 것은 부호 없음의 텍스처 포맷 뿐이다. 부호 없음의 텍스처 포맷은, R, G, B, L 의 색성분만큼을 포함하고 있다. 알파 채널이 존재하는 경우는 무시된다. 혼재하는 포맷이 sRGB 의 선형화를 지원 하고 있는 경우는, 부호 없음의 채널만이 영향을 받는다. 이상적이게는, 필터링전에 하드웨어에 의한 선형화를 실행하는 것이 좋지만, DirectX 9.0 에서는, 필터링 후에 하드웨어에 의한 선형화를 실행할 수도 있다.

모든 표면 포맷을 sRGB 공간에 기입할 수 있는 것은 아니다. 선형화 할 수 있는 것은, 이용 플래그 D3DUSAGE_SRGBWRITE 를 사용해 IDirect3D9::CheckDeviceFormat 메서드 를 건네주는 포맷 뿐이다. 그 외의 포맷에서는, 렌더링 스테이트 D3DRS_SRGBWRITEENABLE 는 무시된다. 채널 근처 8 비트의 RGB 부호 없음 포맷은, 이 능력을 공개해야 한다.

이상적이게는, 선형 공간으로 하드웨어에 의한 frame buffer 혼합 처리를 실행하는 것이 좋지만, 픽셀 셰이더의 뒤, frame buffer 블렌더의 전에 하드웨어로 이것을 실행할 수도 있다. 이것은,sRGB 공간에서 frame buffer 혼합 처리를 실시하면 올바른 결과를 얻을 수 없는 것을 의미한다. 렌더링 타겟의 클리어를 실행하고 있는 동안은, D3DRS_SRGBWRITEENABLE 가 유효하게 되어 있다. 복수의 렌더링 타겟 또는멀티 엘리먼트 텍스처를 지원 하고 있는 하드웨어에서는, 최초의 렌더링 타겟 또는 요소만이 써진다.

API 의 변경

// New sampler state (DWORD)
// If this is nonzero, the texture is linearized on lookup.
D3DSAMP_SRGBTEXTURE       // Default FALSE

// New render state (DWORD)
D3DRS_SRGBWRITEENABLE     // Default FALSE

// New usage flags
D3DUSAGE_SRGBWRITE,
D3DUSAGE_SRGBREAD

윈도우 스왑 체인

애플리케이션의스왑 체인의 백 버퍼를 선형 공간으로 보관 유지하는 것은, 혼합 처리를 올바르게 실시하기 위한 수단으로서 유효하다. 데스크탑은 보통은 선형 공간에 없기 때문에, 백 버퍼의 컨텐츠를 표시하려면 감마 보정이 필요하다. 애플리케이션으로 이 보정을 적용하려면 , 추가의 버퍼를 할당해, 선형 버퍼로부터 백 버퍼에의 독자적인 보정 복사를 실행한다. 이것에 의해 추가의 복사가 필요하게 되지만, 드라이버가 프레젠테이션 blit 의 일부로서 감마 보정을 실행하는 경우는 이것을 회피할 수 있다.

IDirect3DSwapChain9::Present 에서는, 새로운 D3DPRESENT_LINEAR_CONTENT 플래그를 사용할 수 있다. 이 플래그가 설정되어 있으면 다음과 같이 된다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP