Аз чета Метал настойнически на 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]
, Дали това е несъвместимост между координатната система Metal и GLKit?
Това ли е специален избор, направен от този урок? Ако не, има ли други несъвместимости между GLKit и металната математика?
Актуализация: Намерих хубава илюстрация за металната космическа координатна система от сесията WWDC 2016: Приемане на метал I.
Отговори:
3 за отговор № 1Цитат от този форум въпрос
OpenGL използва различни координати на клип-пространството, отколкотоМетал (в GL, z отива от -1 до 1, докато в Metal z отива от 0 до 1), използвайки GLKMatrix4MakePerspective не ви дава правилна матрица се трансформира от пространството за окото в клип пространството. Вместо това, тя трансформира половината на зрителния обем зад очите, причинявайки понякога едва доловим проблеми с изрязване и изрязване. Можете да поправите матрицата, която се връщате от GLK чрез определяне на матричните елементи, които са свързани с дълбочината от добавяне на следния код в makePerspectiveViewAngle:
нека zs = farZ / (близо до Z - farZ)
q [2] [2] = zs
q [3] [2] = zs * близо до Z