/ / GLKit срещу Метална перспектива матрична разлика - swift, opengl, 3d, метал, glkit

GLKit vs. Metal перспектива матрична разлика - бърза, opengl, 3d, метална, glkit

Аз чета Метал настойнически на 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