我正在阅读教程 on raywenderlich.com,其中介绍了一个纯Swift float4x4 帮助者类。99%的情况下,它只是GLKit函数的包装器,除了一个真正令我困惑的函数:
static func makePerspectiveViewAngle(_ fovyRadians: Float, aspectRatio: Float, nearZ: Float, farZ: Float) -> float4x4 {
var q = unsafeBitCast(GLKMatrix4MakePerspective(fovyRadians, aspectRatio, nearZ, farZ), to: float4x4.self)
let zs = farZ / (nearZ - farZ)
q[2][2] = zs
q[3][2] = zs * nearZ
return q
}为什么它需要改变q[2][2]和q[3][2]。这是金属和GLKit坐标系之间的不相容吗?
这是本教程做出的特定选择吗?如果没有,GLKit和金属数学之间还有其他不相容之处吗?
更新:我在2016年会议上找到了一个关于金属剪辑空间坐标系的很好的说明:采用金属I。

发布于 2018-01-18 17:54:47
引用这个论坛问题
OpenGL使用与金属不同的剪辑空间坐标(在GL中,z从-1到1,而在Metal从0到1),所以使用GLKMatrix4MakePerspective不会给出一个从眼睛空间转换到剪辑空间的矩阵。相反,它会改变眼睛后面一半的观看量,有时会导致微妙的剪裁和剔除问题。通过将以下代码添加到makePerspectiveViewAngle中,您可以通过设置与深度相关的矩阵元素来修复从GLK返回的矩阵: 设zs = farZ / (nearZ - farZ) q2 = zs q3 = zs * nearZ
https://stackoverflow.com/questions/48311452
复制相似问题