以制作含字符串的texture为例。

public static Texture2D CreateStringTexture(GraphicsDevice graphcisDevice, string str, SpriteFont font, Color color)
        {
           
            Vector2 size = font.MeasureString(str);
            RenderTarget2D rt = new RenderTarget2D(graphcisDevice, (int)size.X, (int)size.Y, 1, SurfaceFormat.Color);

            RenderTarget old = graphcisDevice.GetRenderTarget(0);
            graphcisDevice.SetRenderTarget(0, rt);

            graphcisDevice.Clear(ClearOptions.Target, Color.TransparentWhite, 0, 0);

            SpriteBatch spriteBatch = new SpriteBatch(graphcisDevice);
            spriteBatch.Begin();
            spriteBatch.DrawString(font, str, Vector2.Zero, color);
            spriteBatch.End();

            graphcisDevice.SetRenderTarget(0, old as RenderTarget2D);
            spriteBatch.Dispose();

            return rt.GetTexture();
        }

以上有几点要注意,首先要定义一个RenderTarget2D对象,顾名思义,就是渲染目标。为什么会有渲染目标?因为通常情况下我们总是把图画到屏幕上,但实际上我们可以把图画到内存中。这种供画图的“东西”(屏幕或内存)抽象后就叫做渲染目标,更形象地说这里我们生成了一张白纸。一个显卡上有多个渲染目标的放置点,我们可以选择性的把某个渲染目标画到屏幕上,或者仅仅是画到一个Texture2D对象上。构造函数第四个参数是numberLevels,意思是你要给它生成的mipmap有几层。这个作用主要是在3D场景中,为了加速渲染,会给一张贴图同时储存不同压缩比的图像数据,以方便场景中物体与摄像机距离变换时可以快速切换贴图,而不用临时放缩。这里用1,因为2D里没有远近之分。

接下来声明了一个RenderTarget类型的old对象,RenderTarget是RenderTarget2D的父类。这个old的作用是保存当前呈现在屏幕上的画纸上的图像。因为显卡这个“画笔工具”一次只能画一张图,所以当我们要借用它来画我们需要的贴图时,必须先把它之前画一半的图保存起来。RenderTarget old = graphcisDevice.GetRenderTarget(0);

graphcisDevice.SetRenderTarget(0, rt);

好了,现在显卡已经对准了我们生成的新的画纸rt,我们把它清空,然后像画其他贴图一样用spriteBatch在上面画上任何东西。

画完之后,要把显卡返回给之前画了一半的图纸old。

然后,我们就可以用rt这张图纸上的东西生成一个Texture2D对象了,一个GetTexture()方法搞定。这时候返回的Texture2D对象上的内容就是刚才用SpriteBatch画的所有东西的一个集合。

posted on 2009-03-26 16:51  中大信息中心数媒部  阅读(912)  评论(2编辑  收藏  举报