轉換色彩空間的數據
若要撰寫到畫面或執行浮點運算,您必須在正確的色彩空間中工作。 建議您在線性色彩空間中執行浮點運算。 然後,若要將影像呈現到畫面,請將數據轉換成標準 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 更正的色彩空間。 同樣地,當著色器資源檢視 (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 轉換。
這些步驟是遵循的步驟,以確保螢幕上顯示的內容具有最佳的色彩精確度。
確保管線中的色彩精確度
- 如果紋理有 sRGB 內容,請確定 ShaderResourceView 具有_SRGB格式修飾詞,因此當您從 ShaderResourceView 讀取到著色器時,您會將紋理內容從 gamma 2.2 更正的色彩空間轉換為線性色彩空間。
- 請確定 RenderTargetView 也有_SRGB格式修飾詞,以便著色器輸出值經過伽瑪轉換。
如果您遵循上述步驟,當您呼叫 IDXGISwapChain1::P resent1 方法時,畫面上顯示的內容具有最佳的色彩精確度。
您可以使用ID3D11Device::CreateRenderTargetView方法,從只使用DXGI_FORMAT_*_UNORM格式建立的交換鏈結,在後台緩衝區上建立DXGI_FORMAT_*_SRGB檢視。 這是建立轉譯目標檢視規則的特殊例外,該規則指出只有在您建立想要使用 DXGI_FORMAT_*_TYPELESS 的資源時,才能使用ID3D11Device::CreateRenderTargetView 使用不同的格式。
如需轉換資料之規則的詳細資訊,請參閱 數據轉換規則。
如需如何同時讀取和寫入紋理的相關信息,請參閱 解除封裝和封裝DXGI_FORMAT以進行就地影像編輯。
相關主題