/ / GLKit vs. diferença de matriz de perspectiva de metal - swift, opengl, 3d, metal, glkit

Diferença de matriz de perspectiva do GLKit vs. Metal - rápida, opengl, 3d, metal, glkit

Eu estou lendo um metal tutorial em raywenderlich.com, onde apresenta um flutuador Swift puro 4x4 classe ajudante. 99% é apenas envolver as funções do GLKit, exceto uma função que realmente me intriga:

  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
}

Por que isso precisa mudar q[2][2] e q[3][2]. Existe alguma incompatibilidade entre o sistema de coordenadas do Metal e do GLKit?

Essa é uma escolha específica feita neste tutorial? Caso contrário, existem outras incompatibilidades entre o GLKit e a matemática do Metal?


Atualizar: Encontrei uma boa ilustração sobre o sistema de coordenadas de espaço de clipe do Metal na Sessão da WWDC 2016: Adotando o Metal I.

clip-space

Respostas:

3 para resposta № 1

Citando de esta pergunta no fórum

O OpenGL usa coordenadas diferentes de espaço de clipe queMetal (em GL, z vai de -1 a 1, enquanto no Metal z vai de 0 a 1), então usar GLKMatrix4MakePerspective não fornece uma matriz que adequadamente transforma do espaço dos olhos para o espaço do clipe. Em vez disso, transforma metade do volume de visualização atrás dos olhos, causando sutilezas questões de recorte e seleção. Você pode consertar a matriz que voltar GLK, definindo os elementos da matriz relevantes para a profundidade, adicionando o seguinte código ao makePerspectiveViewAngle:

Seja zs = farZ / (nearZ - farZ)

q [2] [2] = zs

q [3] [2] = zs * nearZ