非常感謝您的回答。正如傑西霍爾所說,它看起來像是驅動器(或硬件)問題。我在其他配置上嘗試了相同的應用程序,並按預期工作。我測試了共享相同GPU(ATI 4800 HD)但驅動程序版本不同的其他計算機上的應用程序,並且它們都顯示相同的錯誤行爲(在寫入時似乎是雙伽馬校正)。在這些計算機上,如果必須將D3DRS_SRGBWRITEENABLE設置爲false以修復顯示。任何人都知道這是否是這個硬件上的一個已知錯誤?
更爲奇怪的是,我得到了相同的最終結果與這兩種配置:
- D3DRS_SRGBWRITEENABLE = FALSE和D3DSAMP_SRGBTEXTURE爲TRUE
- D3DRS_SRGBWRITEENABLE = FALSE和D3DSAMP_SRGBTEXTURE爲FALSE
在像素調試器,我發現在情況1中線性化得到正確應用,但寫入(自動)校正給出與情況2相同的輸出(根本不執行任何轉換)...
// - END OF UPDATE
我在修復DirectX9應用程序的伽馬校正時遇到了一些麻煩。
當我在採樣器(D3DSAMP_SRGBTEXTURE)中啓用紋理線性化併爲輸出(D3DRS_SRGBWRITEENABLE)寫入sRGB時,它看起來像應用伽馬校正兩次。
這是我的設置。我使用以下紋理(來自here)繪製全屏四色:
結果在圖片的右側視覺上太亮。我使用PIX調試其中一個灰色像素,如果所有設置都正確,我預計輸出值爲0.73(= 0.5 ^(1.0/2.2))。不幸的是,像素着色器的輸出是0.871(看起來它可能是兩次應用伽馬校正?)。我使用調試器進入了像素着色器,並且紋理獲取返回值(0.491,0.491,0.491),這意味着讀取時線性化可以正常工作。
當我禁用D3DRS_SRGBWRITEENABLE,像素着色器的輸出爲0.729看起來更正確的給我。
任何想法,這是否轉換來自(在調試器的像素着色器輸出值爲0.491)?我應該檢查哪些其他標誌/渲染狀態?
非常感謝您的幫助!
聽起來像一個驅動程序錯誤。您是否檢查過不同供應商的硬件?如果你有一個堅實的紋理,讀取它作爲sRGB,然後把它作爲sRGB原封不動地寫出來,你應該得到原始值(由於轉換過程中的精度損失,可能有一個或兩個最低有效位除外)。 –
非常感謝!它看起來像駕駛員問題。我更新了問題以提供有關該問題的更多反饋,因爲我還沒有完全理解它;-) – Ozirus