色彩空間的資料轉換
若要撰寫到畫面或執行浮點運算,您必須在正確的色彩空間中工作。 建議您在線性色彩空間中執行浮點運算。 然後,若要將影像呈現到畫面,請將數據轉換成標準 RGB 數據(sRGB、gamma 2.2 更正)色彩空間。 在 sRGB 色彩空間中向螢幕呈現對於色彩精確度很重要。 如果影像不是正確地進行伽瑪 2.2 校正,則會分配太多位元或頻寬至人們無法分辨的亮部,並且分配至人們敏感的暗部的位元或頻寬太少,這樣就需要更多位元或頻寬來保持相同的視覺品質。 因此,為了確保最佳的色彩精準度,應將經過伽瑪 2.2 校正的影像呈現在螢幕上。
嚴格來說,實際的 sRGB 傳輸函式是一個分段公式(線性線段 + 2.4 次方),與原始 2.2 次方伽瑪稍有不同。 但為了簡單起見,我們將交替使用它們。
色彩精確度
針對簡報,整數值顯示格式(例如 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB、DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM等等)一律包含 sRGB gamma 更正的數據。 浮點數顯示格式(目前僅 DXGI_FORMAT_R16G16B16A16_FLOAT)包含線性值數據。
_SRGB 格式修飾符 會指示作業系統協助應用程式在螢幕上放置 sRGB 資料。 應用程式必須一律將 sRGB 資料放入具有整數值格式的後台緩衝區,才能將 sRGB 數據呈現至畫面,即使數據的格式名稱中沒有這個格式修飾詞也一樣。 如需顯示輸出格式的完整清單:
- Direct3D 功能層級 12.1 硬體 的 DXGI 格式支援
- 為 Direct3D 功能層級 12.0 硬體提供的 DXGI 格式支援
- Direct3D 功能層級 11.1 硬體 的 DXGI 格式支援
- Direct3D 11.0 功能層級硬體的 DXGI 格式支援
- Direct3D 10Level9 格式的硬體支援
- Direct3D 10.1 格式的硬體支援
- Direct3D 10 格式的硬體支援
當您使用系結至 管線的_SRGB 格式 修飾詞,將浮點輸出值從圖元著色器寫入轉譯目標檢視(RenderTargetViews),您可以將它們轉換成 gamma 2.2 更正的色彩空間。 同樣地,當具有_SRGB格式修飾詞的著色器資源檢視(ShaderResourceViews)綁定至管線時,從 ShaderResourceViews 讀取值並將它們從伽馬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 轉換。
這些步驟是遵循的步驟,以確保螢幕上顯示的內容具有最佳的色彩精確度。
確保管線中的色彩精確度
- 如果紋理具有 sRGB 內容,請確定 ShaderResourceView 具有 _SRGB 格式修飾符,這樣當你從 ShaderResourceView 讀取到著色器時,就能將紋理內容從經過 gamma 2.2 校正的色彩空間轉換為線性色彩空間。
- 請確保 RenderTargetView 也具有 _SRGB 格式修飾符,以便將著色器輸出值進行伽瑪轉換。
如果您遵循上述步驟,當您呼叫 IDXGISwapChain1::Present1 方法時,畫面上顯示的內容具有最佳的色彩準確度。
您可以使用 ID3D11Device::CreateRenderTargetView 方法,從您只以 DXGI_FORMAT_*_UNORM 格式建立的交換鏈,在後置緩衝區上建立 DXGI_FORMAT_*_SRGB 檢視。 這是建立轉譯目標檢視的規則中一個特殊的例外,根據該規則,如果您用 DXGI_FORMAT_*_TYPELESS格式建立了資源,那麼您才能使用 ID3D11Device::CreateRenderTargetView 時選擇不同的格式。
如需轉換資料規則的詳細資訊,請參閱 資料轉換規則。
如需如何同時讀取和寫入紋理的相關信息,請參閱 解壓縮和封裝DXGI_FORMAT,以取得 In-Place 影像編輯。
相關主題