如何在Xamarin for Android中使用OpenTK将OpenGL渲染作为位图?

时间:2013-12-20 22:08:25

标签: c# android xamarin opentk

我尝试了两种不同的方法来实现这一点,第一种是Android风格的方法,第二种是OpenGL风格的方法。从我的活动中,我创建了一个包含OpenGL(1.1)代码的视图。

第一种方法(android):

Bitmap b = gameView.GetDrawingCache (true); // this is always null

第二种方法(opengl):

public Bitmap GrabScreenshot()
{
        int size = Width * Height * 4;
        byte[] bytes = new byte[size];
        GL.ReadPixels<byte>(0, 0, Width, Height, All.Rgba, All.UnsignedByte, bytes);
        Bitmap bmp = BitmapFactory.DecodeByteArray (bytes, 0, size);
        return bmp;
}

2 个答案:

答案 0 :(得分:2)

我还没有测试过这段代码。我以为你可以用它作为指导。

尝试这样的事情(源自:OpenTK Forums):

    public Bitmap GrabScreenshot()
    {

        Bitmap bmp = new Bitmap(Width, Height);
        System.Drawing.Imaging.BitmapData data =
            bmp.LockBits(otkViewport.ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly,
                         System.Drawing.Imaging.PixelFormat.Format24bppRgb);

        GL.Finish();
        GL.ReadPixels(0, 0, this.otkViewport.Width, this.otkViewport.Height, PixelFormat.Bgr, PixelType.UnsignedByte,  data.Scan0);
        bmp.UnlockBits(data);
        bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
        return bmp;
    }

我认为由于字节格式化可能会出现问题。在示例中,它们使用

明确说明数据数组的开头
data.Scan0

但是,您只需发送一个字节数组。

答案 1 :(得分:1)

这是一个适用于Xamarin.Android的版本:

    private static Bitmap GraphicsContextToBitmap(int width, int height)
    {
        GL.Flush();
        GL.PixelStore (PixelStoreParameter.PackAlignment, 1);

        var bitmap = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888);

        var data = bitmap.LockPixels();     
        GL.ReadPixels(0, 0, width, height, PixelFormat.Rgba, PixelType.UnsignedByte, data);
        GL.Finish();  
        bitmap.UnlockPixels();

        return bitmap;
    }