2012-05-10 12 views
2

XNAでゲームを作ろうとしていて、レベルにピクセルシェーダを適用しているので、ゲームプレイ画面にエフェクトを追加できます。シェイダー自体はうまく機能していますが、実際にはパフォーマンスを後押しする欠点が1つあります。シェーダがアクティブである限り、私がスクリーンに描画するものは、アルファチャンネルで描画されたかのように動作します。私はColorクラスで構築されたXNAを使ってたくさんのことを描いています。その多くはアルファの変化があります。しかし、シェーダはこれをすべて無視しているようです。これは、シェーダからソースを返すだけでも発生します。カラーからアルファチャンネルを削除する2D Pixel Shader

私はいくつかの解決策を見てきました。最初のものはRenderTarget2Dに描画されていましたが、これでこの問題は解決しましたが、それは私が行きたいとは思っていないアルファにもっと深刻な問題を引き起こしました。

私は少数の人々はシェーダでアルファ値によって色を乗算することを助けるように見えると主張見てきましたが、それはアルファ値の入力が常に1

として読み込まれていることを私に示唆している、全く違いが行われていません

は、ここに私の問題を説明するためにいくつかの画像です:

This is the result with the shader activeThis is what it's supposed to look like

うまくいけば、誰かがこれを解決する方法を知っています。

+0

シェーダコードを投稿してください。 –

+0

もう少しテストをしました。 XNAのSpriteBatch.Drawメソッドの色を変更すると、 "Color.White"を使用してすべてのテクスチャが描画されます。これは私のために非常に問題です。 – Hoeloe

+0

はい、ピクセルシェーダがアルファ値を無視している、または通過していない場合、そのシェーダを使用するとその効果が見えます。シェーダコードを投稿してください。 –

答えて

0

Draw()メソッドでは、シェーダを呼び出すメソッド(つまりDrawUserIndexedPrimitivesなど)を呼び出す前に、 GraphicsDevice.BlendState = BlendState.NonPremultiplied;を呼び出す必要があります。

フレームワークでは、アルファ値が事前に乗算されているとみなされ、RGB値をフレームバッファに正しくblitできます。

関連する問題