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

Для создания текста на экране или выполнения операций с плавающей запятой необходимо работать в правильном цветовом пространстве. Рекомендуется выполнять операции с плавающей запятой в линейном цветовом пространстве. Затем, чтобы представить изображения на экране, преобразуйте данные в стандартное цветовое пространство RGB (sRGB, гамма-исправленное 2.2). Представление на экране в цветовом пространстве sRGB важно для точности цвета. Если изображения не исправлены гамма-2.2, они выделяют слишком много битов или слишком много пропускной способности для выделения, которые люди не могут различать, и слишком мало битов или пропускной способности для теневого значения, к которым люди чувствительны, поэтому потребуется больше битов или пропускной способности для поддержания того же визуального качества. Таким образом, чтобы обеспечить наилучшую точность цвета, выведите на экран изображения с гамма-исправлением 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. Аналогичным образом, если представления ресурсов шейдера (ShaderResourceViews) с модификатором формата _SRGB привязаны к конвейеру, значения из гамма-исправленного цветового пространства 2.2 преобразуются в линейное цветовое пространство при чтении из shaderResourceViews. Затем шейдер может выполнять с ними операции.

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

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

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

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

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