2011-06-28 38 views
2

更新:(DirectX9)隱式應用Gamma校正

非常感謝您的回答。正如傑西霍爾所說,它看起來像是驅動器(或硬件)問題。我在其他配置上嘗試了相同的應用程序,並按預期工作。我測試了共享相同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)繪製全屏四色: enter image description here

結果在圖片的右側視覺上太亮。我使用PIX調試其中一個灰色像素,如果所有設置都正確,我預計輸出值爲0.73(= 0.5 ^(1.0/2.2))。不幸的是,像素着色器的輸出是0.871(看起來它可能是兩次應用伽馬校正?)。我使用調試器進入了像素着色器,並且紋理獲取返回值(0.491,0.491,0.491),這意味着讀取時線性化可以正常工作。

enter image description here

當我禁用D3DRS_SRGBWRITEENABLE,像素着色器的輸出爲0.729看起來更正確的給我。

enter image description here enter image description here

任何想法,這是否轉換來自(在調試器的像素着色器輸出值爲0.491)?我應該檢查哪些其他標誌/渲染狀態?

非常感謝您的幫助!

+1

聽起來像一個驅動程序錯誤。您是否檢查過不同供應商的硬件?如果你有一個堅實的紋理,讀取它作爲sRGB,然後把它作爲sRGB原封不動地寫出來,你應該得到原始值(由於轉換過程中的精度損失,可能有一個或兩個最低有效位除外)。 –

+0

非常感謝!它看起來像駕駛員問題。我更新了問題以提供有關該問題的更多反饋,因爲我還沒有完全理解它;-) – Ozirus

回答

3

一種可能性是您將線性應用於伽瑪變換兩次。一次使用D3DRS_SRGBWRITEENABLE寫入渲染目標時。然後用D3DPRESENT_LINEAR_CONTENT顯示幀緩衝區時(如果您已指定該標誌)。您不需要D3DPRESENT_LINEAR_CONTENT,因爲您已使用D3DRS_SRGBWRITEENABLE轉換回rgb空間。

另一種可能性是,您的圖形硬件正在過濾紋理,然後轉換爲像素着色器的線性空間。您可以通過禁用D3DSAMP_SRGBTEXTURE和過濾來進行測試,然後轉換爲線性空間並在像素着色器中進行過濾。或者簡單地繪製足夠大的紋理,以免過濾成爲問題。對伽瑪校正一篇好文章也提到了GeForce 8系列和更高卡正確地轉換爲線性空間之前,可以在這裏找到過濾:

http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html

如果你不使用D3DPRESENT_LINEAR_CONTENT,然後我的下一個猜測是,你的顯卡不支持你正在做的伽馬轉換。檢查設備的功能程序或使用類似的DirectX工具帽查看器工具:

http://msdn.microsoft.com/en-us/library/ee417852%28v=vs.85%29.aspx

2

這涉及到這個問題,但不完全是,但值得知道的!

我在Vista/Win7上運行D3D9運行時的一個bug。這個運行時間是在D3D10之上編寫的一系列仿真層。在D3D10中,SRGB狀態是紋理格式的一個屬性,在D3D9中它是一個基於渲染器的採樣器。設置D3D9紋理時,由於可能正在使用紋理格式,因此SRGB狀態始終設置爲「關閉」,而D3D9不具有SRGB紋理格式。這意味着需要在紋理綁定之後設置D3DSAMP_SRGBTEXTURE狀態才能正確顯示。

+0

有趣的知道...您有任何URL有關於此的更多信息? – Ozirus

+0

奇怪但正確,至少對我而言。在綁定紋理後,我更改了代碼以設置採樣器狀態之後,渲染結果是正確的。至於仿真層,我聽說過它,但沒有意識到它可能是這樣一個d * ck。 WTH,無論如何我都會轉向D3D12。 – crazii