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