Матрица проекции OpenGL не позволяет ничего отображать - PullRequest
0 голосов
/ 20 мая 2010

Я пытаюсь заставить некоторые базовые OpenGL-ES с шейдерами работать на iPhone, основываясь на некоторых примерах.

По какой-то причине моя матрица проецирования отказывается что-либо отображать на экране. Такое ощущение, что плоскость отсечения установлена ​​очень близко, но это противоречит значениям, которые я предоставляю. Если я отрисовываю ту же сцену с матрицей ортогональной проекции, я вижу свой объект просто без перспективы.

Вот код, который генерирует матрицу проекции:

esPerspective(&proj, 45.f, 768.0/1024.0, 1.f, 10000.f);

void esPerspective(ESMatrix *result, float fovy, float aspect, float nearZ, float farZ)
{
   float frustumW, frustumH;

   frustumH = tanf( fovy / 360.0f * PI ) * nearZ;
   frustumW = frustumH * aspect;

   esFrustum( result, -frustumW, frustumW, -frustumH, frustumH, nearZ, farZ );
}

void esFrustum(ESMatrix *result, float left, float right, float bottom, float top, float nearZ, float farZ)
{
    float       deltaX = right - left;
    float       deltaY = top - bottom;
    float       deltaZ = farZ - nearZ;
    ESMatrix    frust;

    if ( (nearZ <= 0.0f) || (farZ <= 0.0f) ||
          (deltaX <= 0.0f) || (deltaY <= 0.0f) || (deltaZ <= 0.0f) )
         return;

    frust.m[0][0] = 2.0f * nearZ / deltaX;
    frust.m[0][1] = frust.m[0][2] = frust.m[0][3] = 0.0f;

    frust.m[1][1] = 2.0f * nearZ / deltaY;
    frust.m[1][0] = frust.m[1][2] = frust.m[1][3] = 0.0f;

    frust.m[2][0] = (right + left) / deltaX;
    frust.m[2][1] = (top + bottom) / deltaY;
    frust.m[2][2] = -(nearZ + farZ) / deltaZ;
    frust.m[2][3] = -1.0f;

    frust.m[3][2] = -2.0f * nearZ * farZ / deltaZ;
    frust.m[3][0] = frust.m[3][1] = frust.m[3][3] = 0.0f;

    esMatrixMultiply(result, &frust, result);
}

Моя матрица проекции выглядит так:

[3.21, 0, 0, 0]
[0, 2.41, 0, 0]
[0, 0, -1, -1]
[0, 0, -2, 0]

Даже если я вручную установлю ячейку [3] [3] на 1, я все равно ничего не вижу.

Есть идеи?

1 Ответ

0 голосов
/ 20 мая 2010

Поменяйте местами строки и столбцы (т.е. транспонируйте).

Ну, ваша проекционная матрица транспонируется в любом случае. У вас есть матрица основных проекций ряда ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...