DirectX Graphics 프로그래밍 가이드 고정 기능 파이프라인 텍스처 표면 감마 컨트롤   [목차열람] [주소복사] [슬롯비우기]
감마 컨트롤
 
Microsoft DirectX 9.0

감마 컨트롤


감마 컨트롤은, 표면 자체의 컨텐츠에 영향을 주는 일 없이, 시스템이 표면의 컨텐츠를 표시하는 방법을 변경할 수 있다. 이러한 제어는, Microsoft® Direct3D® 가, 데이터를 표면에 남길 때와 스크린상에서 렌더링 되기 전에, 데이터에 적용하는 매우 단순한 필터라고 생각된다.

감마 컨트롤은, 스왑 체인의 프로퍼티이다. 감마 컨트롤은, 시스템이 표시하는 실제의 레벨에 표면의 적·록·청의 레벨 맵을 동적으로 변경할 수 있다. 감마 레벨을 설정하는 것으로, 이펙트를 붙이는 frame buffer에 새로운 이미지를 복사 하지 않고 , 사용자의 스크린에 플래시 컬러 (사용자의 캐릭터를 낼 때의 빨강, 캐릭터가 새로운 아이템을 얻어온다 때의 초록등)를 적용할 수 있다. 또는, 컬러 레벨을 조절해, 백 버퍼의 이미지에 컬러 바이어스를 적용할 수 있다.

Microsoft DirectX® 9.0 의 Direct3D 는 장치의 프로퍼티로서 1 개의 스왑 체인을 가지고 있기 (위해)때문에, 각 장치에 대해서, 항상 적어도 1 개의 스왑 체인 (비명시적인 스왑 체인)이 존재한다. 감마 램프는 스왑 체인의 프로퍼티이므로, 스왑 체인을 윈도우로 할 때는 감마 램프를 적용할 수 있다. 감마 램프는 즉시 유효하게 된다. VSYNC 처리의 대기는 할 수 없다.

IDirect3DDevice9::SetGammaRamp 메서드와 IDirect3DDevice9::GetGammaRamp 메서드에서는, 디스플레이에 대한 디지털 아날로그 컨버터 (DAC)에 픽셀이 보내지기 전에, 표면으로부터 픽셀의 적, 초록, 및 파랑의 색성분에 영향을 주는 램프 레벨을 조작할 수 있다.

감마 램프 레벨

Direct3D 에서는,감마 램프라고 하는 용어는 일련의 값을 나타낸다. 이 일련의 값은, frame buffer의 모든 픽셀에 대해서, 디스플레이에 대한 디지털 아날로그 컨버터 (DAC)가 받는 새로운 레벨에, 특정의 색성분 (적·록·청)의 레벨을 맵핑 하는 값이다. 재맵핑은, 3 개의 참조 테이블 (각각의 색성분에 대해서 1 개)에 의해 실행된다.

여기에서는 그방법에 대해 설명한다. Direct3D 는 frame buffer로부터 픽셀을 취득해, 그 고유의 적·록·청의 색성분으로 픽셀을 얻어온다. 각 성분은 0 ~ 65535 의 값으로 나타낸다. Direct3D 는 원의 값을 취득해, 그 값을 사용해 256 요소의 배열 (램프)에 인덱스를 붙인다. 이 배열의 각 요소에는, 원의 값과 옮겨놓는 값이 포함되어 있다. Direct3D 는, frame buffer내의 각 픽셀의 각 색성분에 대해서 이 참조와 치환의 처리를 실시해, 스크린 위에의 모든 픽셀에 대한 최종적인 색을 변경한다.

램프값의 그래프를 생성 하면, 시각화 되어 용이하게 이해할 수 있다. 다음에, 2 개의 그래프를 나타낸다. 좌측의 그래프는 색이 전혀 변경되지 않는 램프를 나타내고 있다. 우측의 그래프는 부의 바이어스를 적용하는 색성분에 두는 램프를 나타내고 있다.

램프의 그래프

좌측의 그래프의 배열 요소에는, 그러한 인덱스와 동일한 값 (인덱스 0 에는 요소 0, 인덱스 255 에는 65535)이 포함된다. 이러한 값이 표시되기 전의 입력값은 변경할 수 없기 때문에, 이 타입의 램프가 디폴트가 된다. 우측의 그래프는, 보다 큰 변동을 나타낸다. 이 램프에는, 최초의 요소 0 으로부터 마지막 요소 32768 까지의 값이 들어가, 중간의 부분의 값은, 그 범위에서 한결같게 증가한다. 이 결과, 이 램프를 사용하는 색성분의 디스플레이상의 표시를 약하게 할 수 있다. 선형 그래프의 이용인 만큼 한정되지 않는다. 즉, 필요에 따라서, 애플리케이션으로 임의의 맵핑을 할당할 수가 있다. 게다가 입력을 모두 제로로 설정 하면, 디스플레이로부터 색성분을 삭제할 수 있다.

감마 램프 레벨의 설정과 취득

감마 램프 레벨은, frame buffer의 색성분이 표시되는 새로운 레벨에 맵 하기 위해서 Direct3D 가 사용하는, 효과적인 참조 테이블이다. IDirect3DDevice9::SetGammaRamp 메서드 및 IDirect3DDevice9::GetGammaRamp 메서드를 호출하는 것으로, 1차 표면에 대한 램프 레벨을 설정해, 취득할 수 있다. IDirect3DDevice9::SetGammaRamp 는 2 개의 인수를 받아,IDirect3DDevice9::GetGammaRamp 는 1 개의 인수를 받는다. IDirect3DDevice9::SetGammaRamp 의 제 1 인수는, D3DSGR_CALIBRATE 나 D3DSGR_NO_CALIBRATION 중 하나이다. 제 2 인수 pRamp 는,D3DGAMMARAMP 구조체의 포인터이다. D3DGAMMARAMP 구조체는,WORD 의 256 요소의 배열을 3 개 (적·록·청의 감마 램프를 각각 포함한 배열을 1 개씩) 포함한다. IDirect3DDevice9::GetGammaRamp 는, 현재의 감마 램프를 저장 하는 D3DGAMMARAMP 형의 포인터를 취한다.

IDirect3DDevice9::SetGammaRamp 의 제 1 인수에 DDSGR_CALIBRATE 값을 포함하면 새로운 감마 레벨을 설정할 경우에 캐리브레이타를 기동할 수 있다. 감마 램프를 보정 하면 부하가 커지므로, 빈번하게는 사용할 수 없다. 보정된 감마 램프의 설정은, 디스플레이 어댑터 및 모니터에 관계없이, 일관성이 있는 완전한 감마값을 제공한다.

모든 시스템이 감마 보정을 지원 하는 것은 아니다. 감마 보정을 지원 할지 어떨지를 조사하려면 ,IDirect3DDevice9::GetDeviceCaps 를 호출해, 메서드가 돌아온 후에 관련된 D3DCAPS9 구조체의 Caps2 멤버를 조사한다. D3DCAPS2_CANCALIBRATEGAMMA 능력 플래그가 존재 하면, 감마 calibration는 지원 되고 있다.

새로운 램프 레벨을 설정하는 경우, 그 배열로 설정한 레벨은 애플리케이션이 풀 스크린 (배타 모드)의 경우에만 사용된다. 애플리케이션이 노멀 모드로 변경되면 램프 레벨은 무시되어 애플리케이션이 풀 스크린 모드에 복귀할 경우에 다시 유효하게 된다.

장치가 스왑 체인의 현재의 프레젠테이션 모드 (풀 스크린 또는 윈도우)에 대해 감마 램프를 지원 하고 있지 않는 경우에서도, 에러값이 돌아갈 것은 없다. 애플리케이션에서는, D3DCAPS9 형의 Caps2 멤버의 D3DCAPS2_FULLSCREENGAMMA 능력 비트 및 D3DCAPS2_CANCALIBRATEGAMMA 능력 비트를 조사해, 장치의 능력 및 캐리브레이타가 인스톨 되고 있는지 체크할 수 있다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP