如何设计多种分辨率的游戏?

时间:2014-02-22 11:18:35

标签: c# opengl 2d opentk

尝试找出一个处理不同分辨率的好解决方案,并在使用OpenTK(OpenGL)的2D侧滚动射击游戏中进行调整。

Ortho的设置如下。

    private void Setup2DGraphics()
    {
        const double halfWidth = 1920 / 2;
        const double halfHeight = 1080 / 2;
        GL.MatrixMode(MatrixMode.Projection);
        GL.LoadIdentity();
        GL.Ortho(-halfWidth, halfWidth, -halfHeight, halfHeight, -1.0, 1.0);
        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadIdentity();
    }

Ortho修复到1920 * 1080以保持正交固定尺寸。改变大小会改变游戏行为。对象移动设置为像素/秒等。

    public void ResizeWindow(int width, int height)
    {
        var screenSize = GetOptimalResolution(width, height);

        var offsetHeight = screenSize.Y < height ? (height - screenSize.Y) / 2 : 0;
        var offsetWidth = screenSize.X < width ? (width - screenSize.X) / 2 : 0;

        // Set the viewport
        GL.Viewport((int)offsetWidth, (int)offsetHeight, (int)screenSize.X, (int)screenSize.Y);
    }

GetOptimalResolution返回视口大小,以保持16:9的宽高比。示例:如果屏幕大小为1024 * 768,则重新生成1024 * 576(缩小高度)。然后使用高度差的一半作为偏移将视角放置在视口中更高的位置。这会导致窗户上方和下方出现黑条。

此设置有效。它可以防止所有分辨率的宽高比问题。但是,我正在质疑自己这是否是正确的做法?我可以用这个设计思考的问题: - 在低于1920 * 1080的分辨率下,视图按比例缩小。这会影响精灵的外观。例如,缩小时文本开始看起来很糟糕。 - 如果调低分辨率以获得性能,如果正交尺寸保持不变,这会产生影响吗?

在这个主题上做了很多搜索,但到目前为止,我能找到的唯一事情就是如何执行操作,而不是构建解决方案。我还发现使用Mipmap可能会解决我的扩展问题。但问题仍然存在,我是否走在正确的轨道上?我应该从不同的角度看待纵横比问题吗?

1 个答案:

答案 0 :(得分:1)

  

例如,缩小时,文字看起来很糟糕。

不要将纹理用于文本。使用signed distance fields之类的技术以任何分辨率渲染明文。

对于艺术作品,理想的是具有针对各种常见分辨率/ DPI的特定分辨率的艺术作品。如果失败了,如果渲染纹理从源纹理图像缩小,则mipmaps将大大提高渲染纹理的质量。

如果您停止使用像素坐标来执行操作,也可能更容易解决问题。默认的OpenGL屏幕坐标是(-1,-1)左下角到(1,1)右上角。但是,您可以使用正交变换来改变这些,以考虑像这样的宽高比

const double aspect = windowWidth / windowHeight;
if (aspect > 1.0) {
  GL.Ortho(-1 * aspect, 1 * aspect, -1, 1, -1.0, 1.0);
} else {
  GL.Ortho(-1, 1, -1 / aspect, 1 / aspect, -1.0, 1.0);
}

这会在两个维度上生成至少为1 的投影矩阵。这使得您可以将屏幕视为2x2正方形,原点位于中间,观看者可以看到的任何其他内容因为方面是蛋糕。