尝试找出一个处理不同分辨率的好解决方案,并在使用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可能会解决我的扩展问题。但问题仍然存在,我是否走在正确的轨道上?我应该从不同的角度看待纵横比问题吗?
答案 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正方形,原点位于中间,观看者可以看到的任何其他内容因为方面是蛋糕。