Gamma (Direct3D 9)

紋理內容通常會以 sRGB 格式儲存。 傳統上,圖元管線會假設色彩為線性,因此混合作業是線上性空間中執行。 不過,由於 sRGB 內容已修正 gamma,因此線性空間中的混合作業會產生不正確的結果。 視訊卡現在可以在讀取任何 sRGB 內容時復原伽瑪修正,並在寫出圖元時將圖元資料轉換成 sRGB 格式,以修正此問題。 在此情況下,圖元管線內的所有作業都會線上性空間中執行。

Gamma 修正

Direct3D 9 可以:

  • 指出紋理是否已更正伽瑪 2.2 (sRGB)。 驅動程式會轉換成線性伽瑪以在 SetTexture 時間進行混合作業,或者取樣器會在查閱時將它轉換成線性資料。
  • 指出向轉譯目標寫出時,圖元管線是否應該將伽瑪更正回 sRGB 空間。

所有其他色彩(純色、材質色彩、頂點色彩等)都假設線上性空間中。 應用程式可以使用圖元著色器指示,對寫入框架緩衝區的色彩進行伽瑪修正。 線性化應該只套用至 RGB 通道,而不是套用至 Alpha 色板。

並非所有表面格式都可以線性化。 只有使用 D3DUSAGE_QUERY_SRGBREAD 傳遞 CheckDeviceFormat 的格式才能線性化。 其餘部分會忽略取樣器狀態D3DSAMP_SRGBTEXTURE。 只有未帶正負號的紋理格式才支援此轉換。 未帶正負號的紋理格式只包含 R、G、B 和 L 元件。 如果 Alpha 色板存在,則會忽略它。 如果混合格式支援 sRGB 線性化,則只會影響未帶正負號的通道。 在理想情況下,硬體在篩選之前應該先執行線性化,但在 Direct3D 9 中,允許硬體在篩選之後執行線性化。

並非所有表面格式都可以以 sRGB 空間撰寫。 只有使用方式旗標傳遞 CheckDeviceFormat 的格式D3DUSAGE_QUERY_SRGBWRITE才能進行線性化。 其餘部分會忽略轉譯狀態D3DRS_SRGBWRITEENABLE。 每個通道 RGB 不帶正負號格式的八個位應該會公開這項功能。

在理想情況下,硬體應該線上性空間中執行畫面緩衝區混合作業,但硬體可在圖元著色器之後,但在畫面緩衝區混合器之前執行。 這表示在 sRGB 空間中發生的畫面緩衝區混合作業會產生不正確的結果。 執行清楚轉譯目標時,會接受D3DRS_SRGBWRITEENABLE。 對於支援 多個轉譯目標 (Direct3D 9) 多元素紋理 (Direct3D 9) 的硬體,只會寫入第一個轉譯目標或專案。

API 變更

// New sampler state (DWORD)
// If this is nonzero, the texture is linearized on lookup.
D3DSAMP_SRGBTEXTURE       // Default FALSE

// New render state (DWORD)
D3DRS_SRGBWRITEENABLE     // Default FALSE

// New usage flags
D3DUSAGE_QUERY_SRGBWRITE
D3DUSAGE_QUERY_SRGBREAD

視窗交換鏈結

應用程式線上性空間中保留其交換鏈結的背景緩衝區,以便啟用正確的混合作業,這十分有用。 由於桌面通常不線上性空間中,因此必須先進行伽瑪修正,才能顯示背景緩衝區的內容。 應用程式可以藉由配置額外的緩衝區,以及從線性緩衝區執行自己的更正複本到後端緩衝區,來影響此更正本身。 這需要額外的複本,如果驅動程式在簡報中執行伽瑪校正,則可以避免此複本。

在 Direct3D 9 中,新的旗標 D3DPRESENT_LINEAR_CONTENT 可供 Present 使用 ,讓簡報從線性空間隱含轉換成 sRGB/gamma 2.2。 如果退格器格式為 16 位浮點,則應用程式應該指定此旗標,以便比對呈現為全螢幕伽瑪行為的視窗模式,前提是D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION會針對透過 GetDeviceCaps 擷取的裝置功能傳回D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION。

框架緩衝區