1

そのため、ゲームプレイを XNA の RenderTarget2D にレンダリングして、シーンにシェーダーを適用できるようにしようとしています。ある程度は機能していますが、255 以外のアルファ レベルで描画されたものはすべて紫色に着色されているようです。アルファ効果は効いていますが、紫がかっています。解決策を探してみましたが、全画面が紫色にレンダリングされているか、アルファが紫色に置き換えられているように見えるだけです。

私の問題は、それらのどちらでもありません...

紫染め!

これは、何が起こっているかを示すために投げたシーンです。ご覧のとおり、アルファ効果は機能していますが、オブジェクトは紫色に着色されています。

レンダリングコードを投稿する部分は次のとおりです。

gameTarget = new RenderTarget2D(GraphicsDevice, (int)screenSize.X, (int)screenSize.Y, 1, SurfaceFormat.Color, RenderTargetUsage.PreserveContents);

gameDepthBuffer = new DepthStencilBuffer(GraphicsDevice, (int)screenSize.X, (int)screenSize.Y, GraphicsDevice.DepthStencilBuffer.Format);

これは私が使用している初期化です。

GraphicsDevice g = GraphicsDevice;
DepthStencilBuffer d = g.DepthStencilBuffer;
g.SetRenderTarget(0, gameTarget);
g.DepthStencilBuffer = gameDepthBuffer;
g.Clear(Color.Black);
GameBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
        level.Draw(GameBatch);

GameBatch.End();
g.SetRenderTarget(0, null);
g.DepthStencilBuffer = d;
GameBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
        if (renderEffect != null)
        {
            renderEffect.Begin();
            renderEffect.CurrentTechnique.Passes[0].Begin();
        }
        Sprite.Draw(GameBatch, gameTarget.GetTexture(), new Rectangle(0, 0, (int)assumedSize.X, (int)assumedSize.Y), Color.White);
        if (renderEffect != null)
        {
            renderEffect.CurrentTechnique.Passes[0].End();
            renderEffect.End();
        }
        GameBatch.End();

renderEffect はエフェクト ファイル、Sprite は想定される画面サイズ (さまざまな解像度に対応するため) に対する描画を処理するクラスです。

私は XNA 3.1 で作業しています。今では 4.0 を使用する必要があることはわかっていますが、特定の状況で役立つ 3.1 に関する本を持っているため、使用していません。

とにかく、ここでいくつかの助けをいただければ幸いです...

4

2 に答える 2

3

通常、紫は RenderTarget がクリアされるデフォルトの色です。

それを念頭に置いて、レンダー ターゲットを に設定した後、バック バッファーをクリアしていないことがわかりますnull。したがって、コードは次のようになります。

g.SetRenderTarget(0, null);
g.Clear(Color.Transparent);//or black
于 2012-05-11T10:55:58.630 に答える
1

修理済み!いくつかのアルファ パラメータを設定する必要がありました。

GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = true;
GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.One;
GraphicsDevice.RenderState.AlphaSourceBlend = Blend.SourceAlpha;
GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
于 2012-05-12T01:22:18.987 に答える