1

我只是在尝试使用像素着色器。我发现了一个很好的模糊效果,现在我试图创造一种反复模糊图像的效果。

我想如何做到这一点:我想在 RenderTarget 中应用模糊效果渲染我的图像hellokittyTexture ,然后用该渲染的结果替换hellokittyTexture并在每次 Draw 迭代中一遍又一遍地执行此操作:

protected override void Draw(GameTime gameTime)
    {

        GraphicsDevice.Clear(Color.CornflowerBlue);


        GraphicsDevice.SetRenderTarget(buffer1);

        // Begin the sprite batch, using our custom effect.
        spriteBatch.Begin(0, null, null, null, null, blur);
        spriteBatch.Draw(hellokittyTexture , Vector2.Zero, Color.White);
        spriteBatch.End();
        GraphicsDevice.SetRenderTarget(null);

        hellokittyTexture = (Texture2D) buffer1;

        // Draw the texture in the screen
        spriteBatch.Begin(0, null, null, null, null, null);
        spriteBatch.Draw(hellokittyTexture , Vector2.Zero, Color.White);
        spriteBatch.End();

        base.Draw(gameTime);
    }

但我收到此错误“渲染目标在用作纹理时不得在设备上设置。” 因为hellokittyTexture = (Texture2D) buffer1;不是复制纹理而是对 RenderTarget 的引用(基本上它们在分配后是同一个对象)

您知道在 RenderTarget 中获取纹理的好方法吗?或更优雅的方式来做我正在尝试的事情?

4

2 回答 2

3
    spriteBatch.Draw(hellokittyTexture , Vector2.Zero, Color.White);

在这一行中,您正在绘制纹理……它本身……这是不可能的。

假设buffer1hellokittyTexture已正确初始化,请替换此行:

    hellokittyTexture = (Texture2D) buffer1;

有了这个:

        Color[] texdata = new Color[hellokittyTexture.Width * hellokittyTexture.Height];
        buffer1.GetData(texdata);
        hellokittyTexture.SetData(texdata);

这样,hellokittyTexture将被设置为 的副本buffer1而不是指向它的指针。

于 2013-07-12T01:41:43.923 回答
1

只是对 McMonkey 答案的一点补充:

我收到此错误:“在 GraphicsDevice 上主动设置资源时,您不能在资源上调用 SetData。在调用 SetData 之前从设备中取消设置它。” 我通过创建一个新的纹理来解决它。不知道这是否可能是性能问题,但它现在可以工作:

        Color[] texdata = new Color[buffer1.Width * buffer1.Height];
        buffer1.GetData(texdata);
        hellokittyTexture= new Texture2D(GraphicsDevice, buffer1.Width, buffer1.Height);
        hellokittyTexture.SetData(texdata);
于 2013-07-12T13:25:23.983 回答