2009-08-27 4 views
1

D3DXのSpriteオブジェクトで満たされたDirect3Dアプリケーションでは、明るさとコントラストを全体的に調整できるようにしたいと考えています。可能であれば、コントラストは重要です。DirectXでシーンの明るさ/コントラスト/ガンマを調整しますか?

私は、OpenGLについては、ここでこの質問を見てきました

Tweak the brightness/gamma of the whole scene in OpenGL

しかし、それは、私はDirectXのコンテキストで必要となるものを私に与えるものではありません。これはピクセルシェーダでも可能なことだと分かっていますが、それはバズーカでフライを撮るように思えますし、ソフトウェアでシェーダを実行しなければならない古いGPUとの下位互換性についても心配しています。これが可能なはずだと思いますが、オリジナルのHalf Lifeのようなもっと古いゲームでさえ、シェイダーの日の前にこのような設定をしています。

編集:これはフルスクリーンアプリケーションではないので、これはDirect3Dデバイスに影響を与えるだけのもので、モニタ全体のグローバル設定ではないことに注意してください。

+0

これはあなたの問題を解決することはできませんが、私は画像処理コンテキストでワードガンマを使用して、誰もがこれを読むべきだと思う:http://www.alvyray.com/Memos/9_gamma.pdf – Laserallan

答えて

4

ゲームの多くは、文字通り、追加のブレンドを使用して画面上にフルスクリーンのポリを適用することで、明るさを高めます。すなわち

SRCBLEND = ONE 
DESTBLEND = ONE 

、その後の色とテクスチャを適用する(1、1、1、1)必要にその後、コントラストを調整するには1.

により、すべての画素の輝度(ISH)を増加します似ていますが、MULTIPLYは一定の要因で行います。

SRCBLEND = DESTCOLOR 
DESTBLEND = ZERO 

を次のようにこれは(2、2、2、2)の値を持つピクセルをブレンドならば、あなたは、コントラストを変更します。この方法でブレンドの設定が必要になります。

ガンマははるかに複雑な獣です。私はあなたが上記のようにそれを偽造する方法を知らないのです。

いずれの解決策も完全に正確ではありませんが、「少し」正しい結果が得られます。そのどちらかの方がはるかに複雑ですが、これらの方法を使用すると、演奏したさまざまなゲームに似ているようなエフェクトが表示されますが、これは正確に実行しているためです)

+0

これは非常に有望ですね - 私はこれを朝に実験し、実際にどのように動作するかを見ていきます。ありがとう! – x4000

+0

さて、実際には、私はすでにそれをチェックして、それは完璧です!明らかにあなたが言うように100%正確ではありませんが、それは古いGPUフレンドリーで、全体的にかなり効率的であり、結果は十分に十分です。もう一度ありがとう! – x4000

+0

あなたは大歓迎です:) – Goz

1

あなたが使っているのDirectXのバージョンを指定していないので、私は9を仮定しますが、おそらくあなたができる最善のはgamma-ramp functionalityを使用することです。ランプを上下に押すと明るさが増減します。グラデーションを増減するとコントラストが変わります。

+0

残念ながら、全画面、排他モードでのみ動作します。ピクセルシェーダを使用しない非フルスクリーンアプリケーションではこれは不可能かもしれませんが、わかりません。 – x4000

+0

ドキュメントはウィンドウモードで動作することを意味します。実際には、それはあなたのグラフィックスカードとドライバに依存すると思います。 – Kylotan

+0

残念ながら: "新しいランプレベルを設定する場合、配列で設定するレベルは、アプリケーションがフルスクリーンの排他モードである場合にのみ使用されることに注意してください。 (リンクから) – x4000

1

もう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

関連する問題