Вопрос
Я работаю над портированием с OpenGL (OGL) на MetalKit (MTK) на iOS. Мне не удается получить идентичный дисплей в версии приложения MetalKit. Я изменил матрицу проекции, чтобы учесть различия в нормализованных координатах устройства между двумя структурами, но не знаю, что еще нужно изменить, чтобы получить идентичный дисплей. Есть идеи, что еще нужно изменить для переноса из OpenGL в MetalKit?
Изменения матрицы проекции до сих пор ...
Я понимаю, что нормализованные координаты устройства (NDC) отличаются в OGL по сравнению сMTK:
- OGL NDC:
-1 < z < 1
- MTK NDC:
0 < z < 1
Я изменил матрицу проекции для устранения разницы NDC, так какуказано здесь . К сожалению, это изменение матрицы проецирования не приводит к тому же отображению, что и старый код OGL.
Я изо всех сил пытаюсь узнать, что еще можно попробовать.
Фон
Для справки вот некоторая разная справочная информация:
- Матрица вида очень проста (единичная матрица);т.е. камера находится на
(0, 0, 0)
и смотрит в сторону (0, 0, -1)
- В устаревшем коде OpenGL я использовал
GLKMatrix4MakeFrustum
для получения матрицы проекции, используя границы экрана для left
, right
, top
, bottom
и near=1
, far=1000
Я сократил сцену до голой кости во время отладки и ниже приведены 2 изображения: первое из унаследованного кода OGL и второе изMTK, который показывает только «заземленную» плоскость с текстурой отладки и черным фоном.
Любые идеи о том, что еще нужно изменить, чтобы получить идентичный дисплей в MetalKit, будут очень благодарны.
Снимки экрана
OpenGL (прежняя версия)
![OpenGL Scene](https://i.stack.imgur.com/mx4Ma.jpg)
MetalKit
![MetalKit Scene](https://i.stack.imgur.com/s3xfZ.jpg)
Редактировать 1
Я пытался извлечь код, относящийся к расчету и использованию матрицы проекции:
float aspectRatio = 1.777; // iPhone 8 device
float top = 1;
float bottom = -1;
float left = -aspectRatio;
float right = aspectRatio;
float RmL = right - left;
float TmB = top - bottom;
float nearZ = 1;
float farZ = 1000;
GLKMatrix4 projMatrix = { 2 * nearZ / RmL, 0, 0, 0,
0, 2 * nearZ / TmB, 0, 0,
0, 0, -farZ / (farZ - nearZ), -1,
0, 0, -farZ * nearZ / (farZ - nearZ), 0 };
GLKMatrix4 viewMatrix = ...; // Identity matrix: camera at origin, looking at (0, 0, -1), yUp=(0, 1, 0);
GLKMatrix4 modelMatrix = ...; // Different for various models, but even when this is the identity matrix in old/new code the visual output is different
GLKMatrix4 mvpMatrix = GLKMatrix4Multiply(projMatrix, GLKMatrix4Multiply(viewMatrix, modelMatrix));
...
GLKMatrix4 x = mvpMatrix; // rename for brevity below
float mvpMatrixArray[16] = {x.m00, x.m01, x.m02, x.m03, x.m10, x.m11, x.m12, x.m13, x.m20, x.m21, x.m22, x.m23, x.m30, x.m31, x.m32, x.m33};
// making MVP matrix available to vertex shader
[renderCommandEncoder setVertexBytes:&mvpMatrixArray
length:16 * sizeof(float)
atIndex:1]; // vertex data is at "0"
[renderCommandEncoder setVertexBuffer:vertexBuffer
offset:0
atIndex:0];
...
[renderCommandEncoder drawPrimitives:MTLPrimitiveTypeTriangleStrip
vertexStart:0
vertexCount:4];