渲染为纹理2D XNA

本文关键字:2D XNA 纹理 | 更新日期: 2023-09-27 18:26:44

我需要在texture2d中渲染一个精灵,这样这个纹理以后就可以在屏幕上渲染,但同时我需要访问这个修改后的纹理的像素,所以,如果我在纹理中添加一个精灵,并在精灵所在的坐标中调用get pixel函数,那么它应该会给我对应于精灵的新像素值(已经与texture2d混合)。

我使用的是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是一个随机纹理2d

渲染为纹理2D XNA

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

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

这里有一些伪代码:

public Texture2D DrawOnTop(RenderTarget2D target, Texture2D oldTexture, Texture2D picture)
{
    SetRenderTarget(target);
    Draw(oldTexture);
    Draw(picture);
    SetRenderTarget(null);
    return target;
}

如果大小经常变化,并且您无法重用目标,那么至少要处理前一个,就像注释中所建议的那样。除非您及时释放资源,否则每个新目标都会消耗内存。但是在你在着色器中使用它或对它做了任何你想做的事情之后,将其处理掉。一旦处理掉,它就不见了。