iPhone metal 的纵向和横向模式之间的奇怪差异

Odd difference between portrait and landscape mode with iPhone metal

我正在为 iPhone 编写 Metal 应用程序。我有大量的 OpenGL 经验,所以应该不会太难,对吧?

错误。

我正在渲染这个没有宽高比校正的矩形二维场景 - 顶点在 [-1,1] x [-1,1] 坐标中,所以这应该会填满整个屏幕并扭曲场景适合屏幕。

顺便说一句,这是 运行 在相对较新的 iPhone 版本 12.1.2 (16C101) 上。

在横向模式下(宽度 > 高度),这是我得到的(屏幕截图):https://imgur.com/r7gJXct。一半的屏幕是空白的。

在纵向模式下(高度 > 宽度),我得到的正是我所期望的(扭曲的方块):https://imgur.com/ZoPoHhR

我认为正在发生的事情是 Metal 只渲染纵向模式,并剪切屏幕外的任何内容,而不 "squishing" 它到屏幕视口。

代码只是基本的金属代码,没有配置。我使用了默认的 Metal iOS 项目,删除了 Renderer 中的代码,并按照 Hello Triangle 教程将制服发送到着色器和不同的顶点数据。

我应该如何解决这个问题 "bug"? 它甚至是一个错误吗?

想通了!

我想在 func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) 中,我必须添加行 metalLayer.frame = view.layer.frame 并且它有效。