감마(Direct3D 9)

텍스처 콘텐츠는 종종 sRGB 형식으로 저장됩니다. 일반적으로 픽셀 파이프라인은 색을 선형으로 간주하여 선형 공간에서 혼합 작업을 수행했습니다. 그러나 sRGB 콘텐츠가 감마 수정되므로 선형 공간에서 혼합 작업을 수행하면 잘못된 결과가 생성됩니다. 이제 비디오 카드 sRGB 콘텐츠를 읽을 때 감마 수정을 실행 취소하고 픽셀을 쓸 때 픽셀 데이터를 다시 sRGB 형식으로 변환하여 이 문제를 해결할 수 있습니다. 이 경우 픽셀 파이프라인 내의 모든 작업은 선형 공간에서 수행됩니다.

감마 보정

Direct3D 9는 다음을 수행할 수 있습니다.

  • 텍스처가 감마 2.2 수정되었는지 여부를 나타냅니다(sRGB 여부). 드라이버는 SetTexture 시간에 혼합 작업을 위해 선형 감마로 변환하거나 샘플러가 조회 시 선형 데이터로 변환합니다.
  • 렌더링 대상에 쓸 때 픽셀 파이프라인이 sRGB 공간으로 다시 수정해야 하는지 여부를 나타냅니다.

다른 모든 색(투명한 색, 재질 색, 꼭짓점 색 등)은 선형 공간에 있는 것으로 간주됩니다. 애플리케이션은 픽셀 셰이더 지침을 사용하여 프레임 버퍼에 기록된 색을 감마 수정할 수 있습니다. 선형화는 알파 채널이 아닌 RGB 채널에만 적용되어야 합니다.

모든 표면 형식을 선형화할 수 있는 것은 아닙니다. D3DUSAGE_QUERY_SRGBREAD CheckDeviceFormat을 전달하는 형식만 선형화할 수 있습니다. 샘플러 상태 D3DSAMP_SRGBTEXTURE 나머지는 무시됩니다. 서명되지 않은 텍스처 형식만 이 변환을 지원해야 합니다. 서명되지 않은 텍스처 형식에는 R, G, B 및 L 구성 요소만 포함됩니다. 알파 채널이 있으면 무시됩니다. 혼합 형식이 sRGB 선형화를 지원하는 경우 서명되지 않은 채널만 영향을 받습니다. 이상적으로 하드웨어는 필터링하기 전에 선형화를 수행해야 하지만 Direct3D 9에서는 필터링 후 하드웨어에서 선형화를 수행할 수 있습니다.

모든 표면 형식을 sRGB 공간으로 작성할 수 있는 것은 아닙니다. 사용 플래그 D3DUSAGE_QUERY_SRGBWRITE CheckDeviceFormat을 전달하는 형식만 선형화할 수 있습니다. 렌더링 상태 D3DRS_SRGBWRITEENABLE 나머지는 무시됩니다. 채널 RGB 부호 없는 형식당 8비트가 이 기능을 노출해야 합니다.

이상적으로 하드웨어는 선형 공간에서 프레임 버퍼 혼합 작업을 수행해야 하지만 하드웨어는 픽셀 셰이더 뒤와 프레임 버퍼 블렌더 전에 이를 수행할 수 있습니다. 즉, sRGB 공간에서 발생하는 프레임 버퍼 혼합 작업은 잘못된 결과를 생성합니다. 렌더링 대상의 지우기를 수행하는 동안 D3DRS_SRGBWRITEENABLE 적용됩니다. 여러 렌더링 대상(Direct3D 9) 또는 다중 요소 텍스처(Direct3D 9)를 지원하는 하드웨어의 경우 첫 번째 렌더링 대상 또는 요소만 기록됩니다.

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_QUERY_SRGBWRITE
D3DUSAGE_QUERY_SRGBREAD

창이 지정된 스왑 체인

애플리케이션이 올바른 혼합 작업을 사용하도록 설정하기 위해 스왑 체인의 백 버퍼를 선형 공간에 유지하는 것이 중요합니다. 데스크톱은 일반적으로 선형 공간에 없으므로 백 버퍼의 내용을 표시하려면 감마 수정이 필요합니다. 애플리케이션은 추가 버퍼를 할당하고 선형 버퍼에서 백 버퍼로 자체 수정 복사본을 수행하여 이 수정 자체에 영향을 줄 수 있습니다. 이렇게 하려면 드라이버가 프레젠테이션 블릿의 일부로 감마 보정을 수행하는 경우 방지할 수 있는 추가 복사본이 필요합니다.

Direct3D 9에서는 프레젠테이션을 선형 공간에서 sRGB/감마 2.2로 암시적으로 변환할 수 있는 새 플래그 D3DPRESENT_LINEAR_CONTENT 프레젠테이션에 사용할 수 있습니다. GetDeviceCaps를 통해 검색된 디바이스 기능에 대해 D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION 반환되는 경우 애플리케이션은 전체 화면 감마 동작에 있는 창 모드를 일치시키기 위해 백버퍼 형식이 16비트 부동 소수점인 경우 이 플래그를 지정해야 합니다.

프레임 버퍼