1

私は XNA で作業していて、次の問題にぶつかりました。私の目標は、多数の異なるテクスチャをテクスチャに描画し、最終的なテクスチャを特定のアルファ値で画面に描画することでした。

問題は、私が描画するテクスチャがフルスクリーンであり、透明度ではなく色で塗りつぶされているため、その背後にあるすべてがブロックされていることです.

すべてが2Dです。これが私のコードです:

public void Draw(SpriteBatch sb)
            {
            if (opacity > 0)
                {
                gd.SetRenderTarget(formTexture);
                gd.Clear(Color.Transparent);
                for (int i=0; i<formItems.Count; i++)
                    {
                    ((FormItem)formItems[i]).draw(sb);
                    }
                sb.Begin(SpriteSortMode.Immediate, BlendState.Additive);
                    for (int i=0; i<formItems.Count; i++)
                        {
                        FormItem fi = (formItems[i] as FormItem);
                        if (fi.glow != null)
                            {
                            sb.Draw(fi.glow, new Rectangle((int) fi.location.X + fi.width/2 - fi.glow.Width/2, (int) fi.location.Y + fi.height/2 - fi.glow.Height/2, fi.glow.Width, fi.glow.Height), Color.White);
                            }
                        }
                sb.End();
                gd.SetRenderTarget(null);
                sb.Begin();
                sb.Draw(formTexture, new Rectangle(0, 0, gd.Viewport.Width, gd.Viewport.Height), Color.White*opacity);
                sb.End();
                }
            }

formTexture は RenderTarget2D オブジェクトで、gd はグラフィック デバイスです。これは formTexture が初期化される方法です:

formTexture = new RenderTarget2D(this.gd, this.windowWidth, this.windowHeight);
4

1 に答える 1

1

発生している問題は、レンダー ターゲットを設定すると (バックバッファーがレンダー ターゲットとしてカウントされる)、そのレンダー ターゲットがクリアされることです。

少なくともRenderTargetUsage.DiscardContents( MSDN ) が設定されている場合。コンテンツを保存するには高価なコピーが必要な Xbox 360 で適切に機能する唯一のものであるため、これがデフォルトです。(そして、動作を同じクロスプラットフォームに保つためだけに、Windows のデフォルトです)。

バックバッファは、次の行で「これは新しいバッファです」という色 (通常は紫) にクリアされています。

gd.SetRenderTarget(null);

これを解決するには、次の 2 つの方法があります。

推奨される方法は、フレームの先頭にレンダー ターゲットを設定し、その後シーンをバックバッファーに描画するように、すべてのレンダリングを順序付けすることです。レンダー ターゲットに 2 回以上触れないようにします。


もう 1 つの方法はGraphicsDeviceManager.PreparingDeviceSettings、バックバッファを使用するように設定するイベントをアタッチすることRenderTargetUsage.PreserveContentsです。

void SetBackbufferPreserveContents(object sender,
                                   PreparingDeviceSettingsEventArgs e)
{
    e.GraphicsDeviceInformation.PresentationParameters.RenderTargetUsage
            = RenderTargetUsage.PreserveContents;
}

// in your game constructor:
graphics.PreparingDeviceSettings += SetBackbufferPreserveContents;

この 2 番目の方法は、ゲームが Windows のみをターゲットにしている場合にのみ使用してください。

于 2012-09-11T08:37:38.977 に答える