【问题标题】:How to design a game for multiple resolutions?如何设计多分辨率的游戏?
【发布时间】:2014-02-23 04:51:21
【问题描述】:

试图找出一个好的解决方案来处理不同的分辨率并在使用 OpenTK (OpenGL) 构建的 2D 横向滚动射击游戏中调整大小。

正交设置如下。

    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();
    }

正交固定为 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 可能会解决我的缩放问题。然而问题仍然存在,我在正确的轨道上吗?是不是应该换个角度看纵横比问题?

【问题讨论】:

  • 我认为你应该看看游戏 Hammerwatch。它在内部使用低分辨率,但不会平滑缩放,但在适当的时候,最终结果不需要在像素之间进行插值。

标签: c# opengl 2d opentk


【解决方案1】:

例如,文字在按比例缩小时开始看起来很糟糕。

不要对文本使用纹理。使用signed distance fields 之类的技术以任何分辨率呈现明文。

对于艺术作品,理想的情况是为各种常见分辨率/DPI 制作特定分辨率的艺术作品。如果做不到这一点,如果从源纹理图像按比例缩小,mipmap 将大大提高渲染纹理的质量。

如果您停止使用像素坐标来解决问题,也可能更容易解决问题。默认的 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 正方形,原点位于中间,而观众可以看到的任何其他东西都是蛋糕。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2014-05-08
    • 2012-11-20
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多