Преобразование данных для цветового пространства

Чтобы создать на экране или выполнить операции с плавающей запятой, необходимо работать в правильном цветовом пространстве. Рекомендуется выполнять операции с плавающей запятой в линейном цветовом пространстве. Затем, чтобы представить изображения на экране, преобразуйте данные в стандартные rgb-данные (sRGB, гамма-2.2 исправлено) цветовое пространство. Представление на экране в цветовом пространстве sRGB важно для точности цвета. Если изображения не гамма-2.2 исправлены, они выделяют слишком много битов или слишком много пропускной способности, чтобы выделить, что люди не могут различать, и слишком мало битов или пропускной способности к теневым значениям, к которым чувствительны люди, и поэтому потребуется больше битов или пропускной способности для поддержания того же визуального качества. Таким образом, чтобы обеспечить лучшую точность цвета, представить изображения на экране, которые гамма-2 исправлены.

Строго говоря, фактическая функция передачи sRGB — это кусковая формула (линейная часть + 2,4 мощность), которая немного отличается от необработанной гаммы 2,2 гаммы. Но для простоты мы будем использовать их взаимозаменяемо.

Точность цвета

Для презентации целочисленные форматы отображения (например, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM и т. д.) всегда содержат гамма-исправленные данные sRGB. Форматы отображения с плавающей запятой (в настоящее время только DXGI_FORMAT_R16G16B16A16_FLOAT) содержат данные с линейным значением.

Модификатор формата _SRGB указывает операционной системе, чтобы помочь приложению разместить данные sRGB на экране. Приложение всегда должно помещать данные sRGB в обратные буферы с целыми значениями форматов, чтобы представить данные sRGB на экране, даже если данные не имеют этого модификатора формата в его имени формата. Полный список форматов сканирования отображения:

При записи значений выходных данных с плавающей запятой из шейдера пикселей в представления рендер-целевого объекта (RenderTargetViews) с модификатором формата _SRGB, привязанным к конвейеру, вы преобразуете их в гамма-исправленное цветовое пространство 2.2. Аналогичным образом, когда представления шейдер-ресурсов (шейдерResourceViews) с модификатором формата _SRGB привязаны к конвейеру, значения преобразуются из гамма-2.2 исправленного цветового пространства в линейное цветовое пространство при чтении их из шейдераResourceView. Затем шейдер может выполнять операции с ними.

Например, используйте код, аналогичный этому, чтобы записывать выходные значения с плавающей запятой из шейдера в формат 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, убедитесь, что шейдерResourceView имеет модификатор формата _SRGB, поэтому при чтении из шейдераResourceView в шейдер вы преобразуете содержимое текстуры из гамма-2.2 исправленного цветового пространства в линейное цветовое пространство.
  2. Убедитесь, что в RenderTargetView также есть модификатор формата _SRGB, поэтому выходные значения шейдера преобразуются гамма-преобразование.

При вызове метода IDXGISwapChain1::P resent1 содержимое, отображаемое на экране, имеет лучшую точность цвета.

Метод ID3D11Device::CreateRenderTargetView можно использовать для создания представлений DXGI_FORMAT_*_SRGB в буферах из цепочки буферов, создаваемой только с помощью формата DXGI_FORMAT_*_UNORM. Это специальное исключение для создания представлений, предназначенных для отрисовки, которое указывает, что можно использовать другой формат с ID3D11Device::CreateRenderTargetView , только если вы создали ресурс, который вы хотите просмотреть с помощью DXGI_FORMAT_*_TYPELESS.

Дополнительные сведения о правилах преобразования данных см. в разделе "Правила преобразования данных".

Сведения о том, как одновременно считывать и записывать в текстуру, см. в разделе "Распаковка" и "Упаковка" DXGI_FORMAT для редактирования изображения на месте.

Улучшение презентации с помощью модели переверки, грязное прямоугольников и прокручиваемых областей