색 공간의 데이터 변환
화면에 작성하거나 부동 소수점 연산을 수행하려면 올바른 색 공간에서 작업해야 합니다. 부동 소수점 연산은 선형 색 공간에서 수행하는 것이 좋습니다. 그런 다음 이미지를 화면에 표시하려면 데이터를 표준 RGB 데이터(sRGB, 감마 2.2 보정) 색 공간으로 변환합니다. 색 정확도를 위해 sRGB 색 공간으로 화면에 표시하는 것이 중요합니다. 이미지가 감마 2.2로 보정되지 않은 경우 사람이 구분할 수 없는 하이라이트에는 너무 많은 비트 또는 대역폭을 할당하고, 사람이 민감하게 구분하는 섀도 값에는 너무 적은 비트 또는 대역폭을 할당하므로 동일한 시각적 품질을 유지하기 위해 더 많은 비트 또는 대역폭이 필요하게 됩니다. 따라서 최상의 색 정확도를 보장하려면 감마 2.2로 보정된 이미지를 화면에 표시해야 합니다.
엄밀히 말하면, 실제 sRGB 전송 함수는 원시 2.2 파워 감마와 약간 다른 조각 수식(선형 세그먼트 + 2.4 파워)입니다. 편의를 위해 여기에서는 굳이 이를 구분해서 사용하지는 않을 것입니다.
색 정확도
프레젠테이션의 경우 정수 값 표시 형식(예: DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM 등)에는 항상 sRGB 감마 보정 데이터가 포함되어 있습니다. 부동 소수점 값 표시 형식(현재 DXGI_FORMAT_R16G16B16A16_FLOAT만 해당)에는 선형 값 데이터가 포함됩니다.
_SRGB 형식 한정자는 앱이 sRGB 데이터를 화면에 배치하는 데 도움이 되도록 운영 체제에 지시합니다. 앱은 데이터의 형식 이름에 이 형식 한정자가 없더라도 항상 sRGB 데이터를 정수 값 형식의 백 버퍼에 배치하여 sRGB 데이터를 화면에 표시해야 합니다. 표시 스캔아웃 형식의 전체 목록은 다음과 같습니다.
- DXGI Format Support for Direct3D Feature Level 12.1 Hardware(Direct3D 기능 수준 12.1 하드웨어에 대한 DXGI 형식 지원)
- DXGI Format Support for Direct3D Feature Level 12.0 Hardware(Direct3D 기능 수준 12.0 하드웨어에 대한 DXGI 형식 지원)
- DXGI Format Support for Direct3D Feature Level 11.1 Hardware(Direct3D 기능 수준 11.1 하드웨어에 대한 DXGI 형식 지원)
- DXGI Format Support for Direct3D Feature Level 11.0 Hardware(Direct3D 기능 수준 11.0 하드웨어에 대한 DXGI 형식 지원)
- Hardware Support for Direct3D 10Level9 Formats(Direct3D 10Level9 형식에 대한 하드웨어 지원)
- Hardware Support for Direct3D 10.1 Formats(Direct3D 10.1 형식에 대한 하드웨어 지원)
- Hardware Support for Direct3D 10 Formats(Direct3D 10 형식에 대한 하드웨어 지원)
픽셀 셰이더의 부동 소수점 출력 값을 파이프라인에 바인딩된 렌더링 대상 뷰(RenderTargetView)에 _SRGB 형식 한정자를 사용하여 작성하면 감마 2.2로 보정된 색 공간으로 변환됩니다. 마찬가지로 _SRGB 형식 한정자가 있는 셰이더 리소스 뷰(ShaderResourceView)가 파이프라인에 바인딩된 경우, ShaderResourceView에서 값을 읽을 때 감마 2.2로 보정된 색 공간에서 선형 색 공간으로 값을 변환합니다. 그런 다음 셰이더는 해당 값에 대한 작업을 수행할 수 있습니다.
예를 들어 다음과 유사한 코드를 사용하여 셰이더의 부동 소수점 출력 값을 RenderTargetView 형식으로 작성합니다.
struct PSOut
{
float4 color : SV_Target;
};
PSOut S( PSIn input )
{
PSOut output;
output.color = float4( 1.0, 0.0, 0.0, 1.0 );
return output;
}
'S' 루틴이 반환되면 부동 소수점(1, 0, 0, 1) 값이 RenderTargetView 형식으로 변환됩니다. 그런 다음 _SRGB 형식 한정자를 RenderTargetView에 할당하면 감마 변환이 발생합니다.
다음은 화면에 표시되는 콘텐츠가 최상의 색 정확도를 갖도록 하기 위해 따라야 하는 단계입니다.
파이프라인에서 색 정확도를 보장하는 방법
- 텍스처에 sRGB 콘텐츠가 있는 경우 ShaderResourceView에 _SRGB 형식 한정자가 있는지 확인하여 ShaderResourceView에서 셰이더로 읽을 때 텍스처 콘텐츠를 감마 2.2 보정 색 공간에서 선형 색 공간으로 변환합니다.
- 셰이더 출력 값이 감마로 변환되도록 RenderTargetView에도 _SRGB 형식 한정자가 있는지 확인합니다.
앞의 단계를 수행하면 IDXGISwapChain1::Present1 메서드를 호출할 때 화면에 표시되는 콘텐츠의 색 정확도가 가장 좋습니다.
ID3D11Device::CreateRenderTargetView 메서드를 사용하여 DXGI_FORMAT_*_UNORM 형식으로만 생성하는 스왑 체인에서 백 버퍼에 DXGI_FORMAT_*_SRGB 뷰를 만들 수 있습니다. 이는 렌더링 대상 뷰를 만드는 규칙의 특별한 예외로, 보려는 리소스를 DXGI_FORMAT_*_TYPELESS로 만든 경우에만 ID3D11Device::CreateRenderTargetView로 다른 형식을 사용할 수 있음을 나타내는 입니다.
데이터 변환 규칙에 대한 자세한 내용은 데이터 변환 규칙을 참조하세요.
텍스처에서 읽기와 쓰기를 동시에 수행하는 방법에 대한 자세한 내용은 현재 위치 이미지 편집을 위한 DXGI_FORMAT 압축 풀기 및 압축을 참조하세요.
관련 항목