渲染到texture2d XNA

时间:2012-03-03 06:23:16

标签: c# xna xna-4.0 texture2d

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

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

感谢。

相当于Graphics.FromImage(img).DrawImage(...在GDI中

我试过这个并且失败了

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

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

如果可能,请避免每次都创建新的渲染目标。在方法之外创建它并重用它以获得最佳性能。

这里有一些伪代码:

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

    Draw(oldTexture);
    Draw(picture);

    SetRenderTarget(null);

    return target;
}

如果大小经常更改并且您无法重复使用目标,请至少处理前一个目标,例如评论中建议的annonymously。除非您及时释放资源,否则每个新目标都将消耗内存。但是在之后处理它你在着色器中使用它或做了你想做的任何事情。处置后它就消失了。