【问题标题】:Render to a texture2d XNA渲染到 texture2d XNA
【发布时间】:2012-03-03 06:23:16
【问题描述】:

我需要在 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

【问题讨论】:

    标签: c# xna xna-4.0 texture2d


    【解决方案1】:

    【讨论】:

    • 对不起,我在粘贴它。再次检查
    • 如果每次更新都创建一个新的RenderTarget2D,则在将渲染目标设置为null或将其放入using语句后调用RenderTarget2D.Dispose()
    • 好吧,我做到了,但是当我稍后访问它的像素时,它说它会抛出一个错误“无法访问已处理的对象。”
    • 如果以后需要更改,请将其存储为实例变量,而不是每次都创建一个。
    • 你是什么意思?之后将其存储为变量。请给我一个简单的方法示例来说明如何做到这一点
    【解决方案2】:

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

    这里有一些伪代码:

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

    如果大小经常变化而你不能重用目标,至少要处理掉之前的目标,如 cmets 中建议的annonymously。每个新目标都会消耗内存,除非你及时释放资源。但是你在着色器中使用它或做任何你想做的事情之后将其丢弃。一旦处理它就消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多