2009-08-27 66 views
1

在一個充滿了D3DX Sprite對象的Direct3D應用程序中,我希望能夠全局調整亮度和對比度。如果可能的話,對比是重要的。在DirectX中調整場景的亮度/對比度/伽馬值?

我在這裏看到了這個問題有關的OpenGL:Tweak the brightness/gamma of the whole scene in OpenGL

但是,這並沒有給我什麼,我需要在一個DirectX環境。我知道這也是我可能用像素着色器做的事情,但這似乎是用火箭筒拍攝蒼蠅,我擔心向後兼容老式GPU,而這些GPU必須在軟件中進行任何着色器。看起來這應該是可能的,我還記得在着色器的日子之前,像原來的半條命(Half Life)這樣的老遊戲也有這樣的設置。

編輯:此外,請注意,這不是一個全屏應用程序,所以這將需要的東西,只會影響一個Direct3D設備,而不是整體監視器的全局設置。

+0

這不會解決你的問題,但我認爲用圖像處理方面的話伽馬每個人都應該閱讀:http://www.alvyray.com/Memos/9_gamma.pdf – Laserallan 2009-08-27 21:16:38

回答

4

許多遊戲通過添加混合在屏幕上應用全屏幕多邊形來增加亮度。即

SRCBLEND = ONE 
DESTBLEND = ONE 

,然後施加紋理的(1,1,1,1)將由1.

調節對比度提高每個像素的亮度(ISH)的彩色則需要通過一個不變的因素來做類似但是MULTIPLY。這將需要混合設置如下

SRCBLEND = DESTCOLOR 
DESTBLEND = ZERO 

這樣,如果你融入一個像素與(2,2,2,2),那麼你將改變對比度的值。

伽瑪是一個更復雜的野獸,我不知道你可以像上面那樣僞造它。

這些解決方案都不是完全準確的,但它們會給你看起來「稍微」正確的結果。它更復雜的做任何一種方式正確,但通過使用這些方法,你會看到效果,將看起來非常類似於你玩過的各種遊戲,這是因爲這正是他們在做什麼;)

+0

這聽起來很有希望 - 我會在早上試驗這個,看看它在實踐中是如何工作的。謝謝! – x4000 2009-08-28 00:23:45

+0

好的,其實我已經檢查過了,它非常完美!顯然它不像你說的那樣100%準確,但它更老 - GPU友好,整體效率非常高,並且提供了足夠好的結果。再次感謝! – x4000 2009-08-28 00:36:55

+0

不客氣:) – Goz 2009-08-28 06:33:23

1

你沒有指定所使用的DirectX版本,所以我會認爲9.也許你能做的最好是使用gamma-ramp functionality。向上和向下推動斜坡增加或減少亮度。增加或減少梯度會改變對比度。

+0

不幸的是,它只適用於全屏,獨佔模式。也許這對於沒有像素着色器的非全屏應用程序是不可能的,我不知道。 – x4000 2009-08-27 19:30:42

+0

該文檔暗示它可以在窗口模式下工作。實際上,我預計它將取決於您的顯卡和驅動程序。 – Kylotan 2009-08-27 21:57:41

+0

不幸的是:「當設置新的斜坡級別時,請記住,只有當您的應用程序處於全屏獨佔模式時,才能使用在陣列中設置的級別。」 (來自鏈接) – x4000 2009-08-28 12:53:10

1

另一種方法是編輯你的所有紋理。除了您將斜坡手動應用到每個圖像文件中的像素數據以生成紋理之外,它基本上與伽瑪映射的方法相同。

1

只需使用着色器。任何至少不支持SM 2.0的東西在這一點上都是古老的。

2

對於我在XNA中製作的遊戲,我使用了像素着色器。這是代碼。 [免責聲明]我不是完全肯定邏輯是正確的,一些設置可以有奇怪的效果(!)[/免責聲明】

float offsetBrightness = 0.0f; //can be set from my C# code, [-1, 1] 
float offsetContrast = 0.0f; //can be set from my C# code [-1, 1] 

sampler2D screen : register(s0); //can be set from my C# code 

float4 PSBrightnessContrast(float2 inCoord : TEXCOORD0) : COLOR0 
{ 
    return (tex2D(screen, inCoord.xy) + offsetBrightness) * (1.0 + offsetContrast); 
} 

technique BrightnessContrast 
{ 
    pass Pass1 { PixelShader = compile ps_2_0 PSBrightnessContrast(); } 
} 
+0

你能解釋一下如何動態設置偏移量?或者,您是否每次更改後都重新編譯着色器代碼? – Ulterior 2012-01-13 08:13:26

相關問題