需要提高OpenGL截图的分辨率

时间:2018-04-18 23:58:23

标签: opengl printing screenshot resolution opentk

我希望从OpenTK的当前场景中获得具有良好分辨率的屏幕截图。我正在使用GL.ReadPixels为场景拍照。如果我将照片保存到磁盘;我发现它的分辨率/质量很低。

以下C#代码用于获取场景照片:

位图bmp = null;

    if (GraphicsContext.CurrentContext != null)
    {
        glControl_window.Invalidate();
        int w = glControl_window.ClientSize.Width;
        int h = glControl_window.ClientSize.Height;
        bmp = new Bitmap(w, h);
        System.Drawing.Imaging.BitmapData data =
        bmp.LockBits(glControl_window.ClientRectangle, 
        System.Drawing.Imaging.ImageLockMode.ReadWrite, 
        System.Drawing.Imaging.PixelFormat.Format24bppRgb);


        GL.ReadPixels(0, 0, w, h, OpenTK.Graphics.OpenGL.PixelFormat.Bgr, 
        PixelType.UnsignedByte, data.Scan0);
        bmp.UnlockBits(data);

        bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);

    }

初始化OpenTK时使用:

         this.glControl_window = new OpenTK.GLControl(new 
         OpenTK.Graphics.GraphicsMode(new OpenTK.Graphics.ColorFormat(32), 
         24,8,4,new OpenTK.Graphics.ColorFormat(0),2,false));

使用OpenTK的resize事件:

            GL.Viewport(0, 0, Width, Height);

我使用OpenTK的paint事件(通过鼠标启用放大/缩小):

              float aspectRatio;
            if (Height == 0 || Width == 0) aspectRatio = 1f; else 
               aspectRatio = Width / (float)Height;

            double W = 20 * aspectRatio / CameraZoomScale, H = 20 / 
               CameraZoomScale;
            GL.Ortho(-0.5 * W, 0.5 * W, -0.5 * H, 0.5 * H, -600.0f, 600.0f);

我需要:

1.增加GL.ReadPixels期间令牌屏幕截图的分辨率。

1 个答案:

答案 0 :(得分:0)

我猜你知道你在这里要求两件非常不同的东西。

第1部分 - 渲染更多像素

使用GL.readpixels()从帧缓冲区读取的像素数始终是与缓冲区大小对应的像素数。即1280x720或类似的东西。

能够读取更多像素的唯一方法是增加OpenGL帧缓冲区的大小/分辨率

查找OpenTK代码中初始化open gl窗口并提高窗口分辨率的部分。寻找类似的东西:

public MainWindow()
    : base(
           1280, // initial width
           720,  // initial height
           ...
    )
{
    // your code
}

并根据需要更改分辨率。您可能还必须覆盖OnResize课程中的GameWindow方法,如下所述:How to change the viewport resolution in OpenTK

第2部分 - 缩放图像

一旦将位图保存到磁盘,任何尝试"增加"分辨率将涉及升级已存在的图像。这最终将导致更多的像素,但也会根据图像和使用的升级算法引入升级伪像。您可以在维基百科上阅读有关不同图像缩放算法的更多信息:Image scaling Algorithms