0

我需要在 texture2d 中渲染一个精灵,以便以后可以在屏幕上渲染这个纹理,但同时我需要访问这个修改过的纹理的像素,所以,如果我添加让我们说纹理中的一个精灵,我在精灵所在的坐标中调用获取像素函数,然后它应该给我对应于精灵的新像素值(已与纹理2d混合)。

我使用的是 xna 4.0 而不是 3.5 或更低。

谢谢。

相当于 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

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

于 2012-03-03T08:34:34.070 回答
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 回答