/ / GLKit vs. Różnica macierzy perspektywy metalowej - swift, opengl, 3d, metal, glkit

GLKit kontra metalowa matryca różnicowa - szybka, opengl, 3d, metal, glkit

Czytam Metal seminarium na raywenderlich.com, gdzie wprowadza czysty Swift float4x4 klasa pomocnika. 99% po prostu otacza funkcje GLKit, z wyjątkiem jednej funkcji, która naprawdę mnie zastanawia:

  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
}

Dlaczego musi się zmienić q[2][2] i q[3][2]. Czy jest to niezgodność między układem współrzędnych Metal?

Czy jest to szczególny wybór, który powstał w tym samouczku? Jeśli nie, czy są jakieś inne niezgodności między matematyką GLKit a matematyką metalową?


Aktualizacja: Znalazłem fajną ilustrację układu współrzędnych Metal Clip z sesji WWDC 2016: Adopting Metal I.

miejsce na klipy

Odpowiedzi:

3 dla odpowiedzi № 1

Cytując z to pytanie na forum

OpenGL używa różnych współrzędnych przestrzeni klipu niżMetal (w GL, z idzie od -1 do 1, natomiast w Metal z od 0 do 1), więc używając GLKMatrix4MakePerspective nie daje prawidłowej macierzy przekształca z przestrzeni oka, aby przyciąć przestrzeń. Zamiast tego przekształca się w połowie objętości oglądania za okiem, powodując niekiedy subtelne problemy z wycinaniem i wybijaniem. Możesz naprawić macierz, którą odzyskasz od GLK ustawiając elementy macierzy, które są istotne dla głębi dodanie następującego kodu do makePerspectiveViewAngle:

niech zs = farZ / (nearZ - farZ)

q [2] [2] = zs

q [3] [2] = zs * nearZ