转换颜色空间的数据

若要撰写到屏幕或执行浮点操作,需要在正确的颜色空间中工作。 建议在线性颜色空间中执行浮点运算。 然后,若要在屏幕上显示图像,请将数据转换为标准 RGB 数据, (sRGB、伽玛 2.2 更正) 颜色空间。 在 sRGB 颜色空间中向屏幕演示对于颜色准确性非常重要。 如果图像不是伽玛 2.2 更正的,则它们分配过多位或太多带宽来突出显示人们无法区分的突出显示,以及太少的位或带宽分配给人们敏感的阴影值,因此需要更多位或带宽来保持相同的视觉质量。 因此,为了确保最佳颜色准确性,请将图像呈现到经过伽马 2.2 更正的屏幕。

颜色精度

对于演示,整数值显示格式 ((如 DXGI_FORMAT_B8G8R8A8_UNORM_SRGBDXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM等)) 始终包含 sRGB 伽玛更正的数据。 浮点值显示格式 (目前仅 DXGI_FORMAT_R16G16B16A16_FLOAT) 包含线性值数据。

_SRGB 格式修饰符 向操作系统指示,以帮助应用在屏幕上放置 sRGB 数据。 应用必须始终将 sRGB 数据置于具有整数值格式的后台缓冲区中,以便在屏幕上显示 sRGB 数据,即使数据的格式名称中没有此格式修饰符。 有关显示扫描输出格式的完整列表:

使用绑定到管道的 _SRGB 格式修饰符将像素着色器中的浮点输出值写入呈现器目标视图 (RenderTargetView) 时,可以将它们转换为经过 gamma 2.2 更正的颜色空间。 同样,当着色器资源视图 (ShaderResourceView) 以及_SRGB格式修饰符绑定到管道时,可以在从 ShaderResourceView读取值时,将值从 gamma 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::P resent1 方法时,屏幕上显示的内容具有最佳的颜色准确度。

可以使用 ID3D11Device::CreateRenderTargetView 方法从仅使用 DXGI_FORMAT_*_UNORM 格式创建的交换链在后台缓冲区上创建 DXGI_FORMAT_*_SRGB 视图。 这是创建呈现目标视图的规则的一个特殊例外,该规则规定,仅当创建了想要使用 DXGI_FORMAT_*_TYPELESS 查看的资源时,才能对 ID3D11Device::CreateRenderTargetView 使用其他格式。

有关转换数据的规则的详细信息,请参阅 数据转换规则

有关如何同时读取和写入纹理的信息,请参阅 解压缩和打包DXGI_FORMAT以In-Place图像编辑

使用翻转模型、脏矩形和滚动区域增强演示文稿