如何在WPF / XNA上制作每像素输出?

时间:2011-09-21 20:44:38

标签: wpf xna

我想在旧的qbasik中绘制,在那里你可以分为5行,PSET(x,y)可以得到任何图形,或者Lissajous数字。

问题:WPF有什么更好的方法?和XNA的方式?

任何样品?

2 个答案:

答案 0 :(得分:1)

对于WPF和Silverlight WriteableBitmap

http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.aspx

WriteableBitmapEx库。试图通过扩展方法来补偿这种方法,这些方法像内置方法一样易于使用,并提供类似GDI +的功能: http://writeablebitmapex.codeplex.com/

答案 1 :(得分:1)

在XNA中,这通常不是最有效的,但我认为最好的办法是创建一个纹理并使用SetData设置每个像素,并使用SpriteBatch将其渲染到屏幕上。

    SpriteBatch spriteBatch;
    Texture2D t;
    Color[] blankScreen;

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);

        //initialize texture
        t = new Texture2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, false, SurfaceFormat.Color);

        //clear screen initially
        blankScreen = new Color[GraphicsDevice.Viewport.Width * GraphicsDevice.Viewport.Height];
        for (int i = 0; i < blankScreen.Length; i++)
        {
            blankScreen[i] = Color.Black;
        }

        ClearScreen();
    }

    private void Set(int x, int y, Color c)
    {
        Color[] cArray = { c };

        //unset texture from device
        GraphicsDevice.Textures[0] = null;
        t.SetData<Color>(0, new Rectangle(x, y, 1, 1), cArray, 0, 1);

        //reset
        GraphicsDevice.Textures[0] = t;
    }

    private void ClearScreen()
    {
        //unset texture from device
        GraphicsDevice.Textures[0] = null;
        t.SetData<Color>(blankScreen);

        //reset
        GraphicsDevice.Textures[0] = t;
    }

    protected override void Draw(GameTime gameTime)
    {
        spriteBatch.Begin();
        spriteBatch.Draw(t, Vector2.Zero, Color.White);
        spriteBatch.End();

        base.Draw(gameTime);
    }

使用此功能,您可以在更新或绘图中随意调用Set或ClearScreen。您可能必须使用纹理索引(我在本例中仅使用0,可能不适合您),而且您只需要每帧取消设置/重置一次,因此您可以根据使用方式对其进行优化它们。