共用方式為


轉換色彩空間的數據

若要撰寫到畫面或執行浮點運算,您必須在正確的色彩空間中工作。 建議您在線性色彩空間中執行浮點運算。 然後,若要將影像呈現到畫面,請將數據轉換成標準 RGB 數據(sRGB、gamma 2.2 更正)色彩空間。 在 sRGB 色彩空間中向螢幕呈現對於色彩精確度很重要。 如果影像不是伽瑪 2.2 更正,則會配置太多位或太多頻寬來醒目提示人們無法區分的位或頻寬,以及太少的位或頻寬來遮蔽人們敏感值的陰影值,因此需要更多位或頻寬來維持相同的視覺品質。 因此,若要確保最佳色彩精確度,請將影像呈現至伽瑪 2.2 更正的畫面。

嚴格來說,實際的 sRGB 傳輸函式是一個分次公式(線性線段 + 2.4 乘冪),與原始 2.2 電源伽瑪稍有不同。 但為了簡單起見,我們將交替使用它們。

色彩精確度

針對簡報,整數值顯示格式(例如DXGI_FORMAT_B8G8R8A8_UNORM_SRGBDXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM等)一律包含 sRGB gamma 更正的數據。 浮點數顯示格式(目前僅 DXGI_FORMAT_R16G16B16A16_FLOAT)包含線性值數據。

_SRGB格式修飾詞會指示操作系統協助應用程式在螢幕上放置 sRGB 數據。 應用程式必須一律將 sRGB 資料放入具有整數值格式的後台緩衝區,才能將 sRGB 數據呈現至畫面,即使數據的格式名稱中沒有這個格式修飾詞也一樣。 如需顯示掃描格式的完整清單:

當您使用系結至管線_SRGB格式修飾詞,將圖元著色器中的浮點輸出值寫入轉譯目標檢視(RenderTargetViews),您可以將它們轉換成 gamma 2.2 更正的色彩空間。 同樣地,當著色器資源檢視 (ShaderResourceViews) 與_SRGB格式修飾詞系結至管線時,當您從 ShaderResourceViews 讀取這些值時,會將值從 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,則會發生 gamma 轉換。

這些步驟是遵循的步驟,以確保螢幕上顯示的內容具有最佳的色彩精確度。

確保管線中的色彩精確度

  1. 如果紋理有 sRGB 內容,請確定 ShaderResourceView 具有_SRGB格式修飾詞,因此當您從 ShaderResourceView 讀取到著色器時,您會將紋理內容從 gamma 2.2 更正的色彩空間轉換為線性色彩空間。
  2. 請確定 RenderTargetView 也有_SRGB格式修飾詞,以便著色器輸出值經過伽瑪轉換。

如果您遵循上述步驟,當您呼叫 IDXGISwapChain1::P resent1 方法時,畫面上顯示的內容具有最佳的色彩精確度。

您可以使用ID3D11Device::CreateRenderTargetView方法,從只使用DXGI_FORMAT_*_UNORM格式建立的交換鏈結,在後台緩衝區上建立DXGI_FORMAT_*_SRGB檢視。 這是建立轉譯目標檢視規則的特殊例外,該規則指出只有在您建立想要使用 DXGI_FORMAT_*_TYPELESS 的資源時,才能使用ID3D11Device::CreateRenderTargetView 使用不同的格式

如需轉換資料之規則的詳細資訊,請參閱 數據轉換規則

如需如何同時讀取和寫入紋理的相關信息,請參閱 解除封裝和封裝DXGI_FORMAT以進行就地影像編輯

使用翻轉模型、髒矩形和卷動區域增強簡報