如何为多分辨率设计游戏



试图找到一个好的解决方案,在使用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可能会解决我的缩放问题。然而,问题仍然存在,我是否走上了正确的轨道?我应该从另一个角度来看待纵横比问题吗?

例如,文本在缩小时开始看起来很可怕。

不要对文本使用纹理。使用一种类似于带符号距离字段的技术,以任何分辨率渲染明文。

对于艺术作品,理想的情况是为各种常见的分辨率/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。这可以让你将屏幕视为一个2×2的正方形,原点在中间,观众可以看到的任何其他东西都是蛋糕。

最新更新