0

このテクスチャを後で画面にレンダリングできるように、texture2d でスプライトをレンダリングする必要がありますが、同時に、この変更されたテクスチャのピクセルにアクセスする必要があるため、テクスチャにスプライトを追加するとします。スプライトがあった座標で get pixel 関数を呼び出すと、(texture2d とブレンドされた) スプライトに対応する新しいピクセル値が返されます。

3.5以下ではなくxna 4.0を使用しています。

ありがとう。

GDI の Graphics.FromImage(img).DrawImage(... に相当するもの

私はこれを試して失敗しました

public static Texture2D DrawSomething(Texture2D old, int X, int Y, int radius) {
var pp = Res.game.GraphicsDevice.PresentationParameters;
var r = new RenderTarget2D(Res.game.GraphicsDevice, old.Width, old.Height, false, pp.BackBufferFormat, pp.DepthStencilFormat,
pp.MultiSampleCount, RenderTargetUsage.DiscardContents);
Res.game.GraphicsDevice.SetRenderTarget(r);
var s = new SpriteBatch(r.GraphicsDevice);
s.Begin();
s.Draw(old, new Vector2(0, 0), Color.White);
s.Draw(Res.picture, new Rectangle(X - radius / 2, Y - radius / 2, radius, radius), Color.White);
s.End();
Res.game.GraphicsDevice.SetRenderTarget(null);
return r;
}

Res.game は基本的にメインのゲーム フォームへのポインターであり、Res.picture はランダムな texture2d です。

4

2 に答える 2

0

可能であれば、毎回新しいレンダー ターゲットを作成することは避けてください。メソッドの外で作成し、最高のパフォーマンスを得るために再利用します。

ここにいくつかの擬似コードがあります:

public Texture2D DrawOnTop(RenderTarget2D target, Texture2D oldTexture, Texture2D picture)
{
    SetRenderTarget(target);

    Draw(oldTexture);
    Draw(picture);

    SetRenderTarget(null);

    return target;
}

サイズが頻繁に変更され、ターゲットを再利用できない場合は、コメントで匿名で提案されているように、少なくとも前のものを破棄してください。時間内にリソースを解放しない限り、新しいターゲットごとにメモリが消費されます。ただし、シェーダーで使用したり、やりたいことをしたりした後は破棄してください。処分したら無くなります。

于 2012-03-03T12:04:53.903 に答える
0

使用RenderTarget2D: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.rendertarget2d.aspx

于 2012-03-03T08:34:34.070 に答える