【问题标题】:OpenGL Orthographic View App Windowed-to-FullscreenOpenGL Orthographic View App 窗口化到全屏
【发布时间】:2012-01-16 04:33:28
【问题描述】:

我正在开发基于图块的 2D OpenGL 游戏(自上而下,2D 塞尔达风格),并且我正在使用正交投影。我想让这个游戏同时兼容窗口和全屏。

我最好创建缩放 2D 绘图函数,以便在以全屏模式绘制时可以放大图块大小,还是应该完全围绕窗口模式设计游戏,然后在任何时候放大整个绘图区域播放器是否处于全屏模式?

最后,我希望在重新缩放图块时保持最好的纹理质量。

更新/澄清:这是我的担忧(这可能是也可能不是真正的问题):如果我绘制整个窗口视图大小的画布区域,然后将其放大,我是可能将最初的 128x128 像素纹理缩小到 64x64 像素窗口大小的纹理,然后当我将整个游戏区域放大以获得全屏视图时再次将它们重新放大到 80x80?

其他背景信息:我正在使用 Java/LWJGL 制作这款游戏​​,并且正在使用 OpenGL 1.1 函数进行绘图。

【问题讨论】:

  • 按比例缩小不是更好吗?从 128x128px
  • 好点。我会修改问题,谢谢!
  • 你的问题到底是什么?
  • 大多数情况下,我只是想弄清楚全屏模式是否涉及以更大的尺寸绘制所有游戏图像,或者以相同的尺寸绘制所有内容但修改投影矩阵。卢卡的回答正是我希望看到的!

标签: opengl lwjgl


【解决方案1】:

不要缩放图块,因为您的全屏窗口比正常窗口大,而是使用投影矩阵。

窗口变大了?放大用于构造投影矩阵的参数。

如果您想保持平铺大小与窗口大小成比例,请不要根据窗口大小更改投影矩阵!

关键是,如果您还没有掌握投影矩阵:由于它,顶点被投影到视口上,实际上顶点被“缩放”,让您选择合适的单位系统而无需担心缩放。


简而言之,正交投影是specified,来自 4 个参数:leftrightbottomtop。这些参数只不过是投影到窗口屏幕边界上的顶点的 XY 坐标(实际上是 viewport)。

让我们做一些具体的例子。

示例 1

窗口大小:400x300

OpenGL 顶点位置(2D):25x25

正交投影矩阵: - 左= 0 - 右= 400 - 底部= 0 - 顶部 = 300

模型视图矩阵设置为恒等

--> 点将在窗口坐标中以 25x25 绘制

示例 2

窗口大小:800x600(示例 1 翻倍)

OpenGL 顶点位置(2D):25x25

正交投影矩阵: - 左= 0 - 右= 400 - 底部= 0 - 顶部 = 300

模型视图矩阵设置为恒等

--> 点将在窗口坐标中以 50x50 绘制。因为正交投影没有改变,所以加倍了。

示例 3

假设我想投影示例 1 中的顶点,即使窗口的纵横比发生变化。以前的窗口是 4:3。本例中的窗口是16:9:它更大!这里的技巧是强制 (right - left)(top - bottom)

之间的比例

窗口大小:1600x900(示例 1 翻倍)

OpenGL 顶点位置(2D):25x25

正交投影矩阵

  • 左= 0
  • 右= 533 (300 * 16 / 9)
  • 底部= 0
  • 顶部= 300

模型视图矩阵设置为恒等

--> 点将在窗口坐标中以 25x25(而不是 33.3x25,如果我们使用示例 1 的投影矩阵)绘制。

【讨论】:

  • 谢谢,卢卡!作为后续问题,当我缩放到具有不同纵横比的不同显示器时,您对正确缩放投影矩阵有什么建议吗?现在,如果我从 16:9 窗口模式切换到 3:4 全屏模式,我的游戏视图会失真。是否可以创建一个信箱投影矩阵?
  • 感谢您提供的精彩示例!你真的帮了很多忙! :)
  • @Luca 你也帮了我很多,因为我正在为自己的游戏学习 ;)
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2012-01-04
相关资源
最近更新 更多