Share via


색 공간의 데이터 변환

화면에 작성하거나 부동 소수점 연산을 수행하려면 올바른 색 공간에서 작업해야 합니다. 부동 소수점 연산은 선형 색 공간에서 수행하는 것이 좋습니다. 그런 다음 이미지를 화면에 표시하려면 데이터를 표준 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 데이터를 화면에 표시해야 합니다. 표시 스캔아웃 형식의 전체 목록은 다음과 같습니다.

픽셀 셰이더의 부동 소수점 출력 값을 파이프라인에 바인딩된 렌더링 대상 뷰(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에 할당하면 감마 변환이 발생합니다.

다음은 화면에 표시되는 콘텐츠가 최상의 색 정확도를 갖도록 하기 위해 따라야 하는 단계입니다.

파이프라인에서 색 정확도를 보장하는 방법

  1. 텍스처에 sRGB 콘텐츠가 있는 경우 ShaderResourceView에 _SRGB 형식 한정자가 있는지 확인하여 ShaderResourceView에서 셰이더로 읽을 때 텍스처 콘텐츠를 감마 2.2 보정 색 공간에서 선형 색 공간으로 변환합니다.
  2. 셰이더 출력 값이 감마로 변환되도록 RenderTargetView에도 _SRGB 형식 한정자가 있는지 확인합니다.

앞의 단계를 수행하면 IDXGISwapChain1::Present1 메서드를 호출할 때 화면에 표시되는 콘텐츠의 색 정확도가 가장 좋습니다.

ID3D11Device::CreateRenderTargetView 메서드를 사용하여 DXGI_FORMAT_*_UNORM 형식으로만 생성하는 스왑 체인에서 백 버퍼에 DXGI_FORMAT_*_SRGB 뷰를 만들 수 있습니다. 이는 렌더링 대상 뷰를 만드는 규칙의 특별한 예외로, 보려는 리소스를 DXGI_FORMAT_*_TYPELESS로 만든 경우에만 ID3D11Device::CreateRenderTargetView로 다른 형식을 사용할 수 있음을 나타내는 입니다.

데이터 변환 규칙에 대한 자세한 내용은 데이터 변환 규칙을 참조하세요.

텍스처에서 읽기와 쓰기를 동시에 수행하는 방법에 대한 자세한 내용은 현재 위치 이미지 편집을 위한 DXGI_FORMAT 압축 풀기 및 압축을 참조하세요.

대칭 이동 모델, 더티 사각형, 스크롤된 영역으로 프레젠테이션 향상