2015-04-07 4 views
0

Я пытаюсь использовать орфографическую проекцию для моего рендеринга графического интерфейса. Когда я рисую сетку, используя только мою регулярную матрицу преобразования, я получаю то, что ожидаю, но когда я использую свою орфографическую проекцию, я ничего не получаю. Моя перспективная проекция прекрасно работает. Моя орто-матрица:OpenGL: Орфографическая проекция

public Matrix4f initOrthographic(float left, float right, float bottom, float top, float near, float far) 
{ 
    m[0][0] = 2.0f/(right - left); m[0][1] = 0;      m[0][2] = 0;     m[0][3] = (left + right)/(left - right); 
    m[1][0] = 0;      m[1][1] = 2.0f/(top - bottom); m[1][2] = 0;     m[1][3] = (bottom + top)/(bottom - top); 
    m[2][0] = 0;      m[2][1] = 0;      m[2][2] = 2.0f/(near - far); m[2][3] = (far + near)/(far - near); 
    m[3][0] = 0;      m[3][1] = 0;      m[3][2] = 0;     m[3][3] = 1; 

    return this; 
} 

Я не могу для жизни меня узнать, что не так. Я умножаю эту матрицу на регулярное преобразование, а затем умножая эту матрицу на положение вершин в шейдере. Есть идеи? При необходимости я могу отправить больше кода/информации.

Я думаю, что я только что нашел проблему. Я имел верх в 0 и снизу на 720, когда я переворачиваю эти значения до 720 верхних и 0 дна, это работает отлично. Единственное, что я хотел бы, чтобы верхний левый угол был (0, 0). Есть ли способ, которым я могу это сделать, или я придерживаюсь нижнего левого (0, 0)?

+1

Похоже, что ваша матрица находится в строчном порядке, в то время как основные матрицы столбцов обычно используются для OpenGL. –

+0

Все мои другие матрицы выполнены таким образом, и они работают нормально. извините, если я не понимаю полностью, я не знаю, что я делаю, когда дело доходит до матриц. – redonkulasman

+0

Считаете ли вы, что вы проверяете настройки своего видового экрана? –

ответ

1

Моя ортогональная матрица выглядит весьма отличается от вашей:

 2.0f/(right - left)       0         0      0 
       0       2.0f/(top - bottom)       0      0 
       0         0       2.0f/(zFar - zNear)   0 
-(right + left)/(right - left)  -(top + bottom)/(top - bottom) -(zFar + zNear)/(zFar - zNear)  1 

Важно то, как вы будете хранить значения. Если вы будете использовать один массив с плавающей точкой для вашей матрицы, вы бы хранить его, как это:

float orthoMat[] = 
{ 
    2.0f/(right - left), 
    0, 
    0, 
    0, 

    0, 
    2.0f/(top - bottom), 
    0, 
    0, 

    0, 
    0, 
    2.0f/(zFar - zNear), 
    0, 

    -(right + left)/(right - left), 
    -(top + bottom)/(top - bottom), 
    -(zFar + zNear)/(zFar - zNear), 
    1 
}; 

Это макет, который OpenGL ожидает вас передать в шейдер. Это соглашение по колонке. DirectX использует соглашение по ряду строк. Таким образом, в основном моя матрица может быть прочитана слева направо, следующая строка, слева направо, а ваша матрица должна быть прочитана сверху вниз, следующий столбец сверху вниз. Если вы переносите свою матрицу, вы получаете почти ту же матрицу, что и я. Существует, однако, некоторые различия между нашими матрицами, даже если транспонировать:

В коде

- m[2][2] should be 2.0f/(zFar - zNear) 
- m[0][3], m[1][3] and m[2][3] should be negative 

Пока вы исправить эти проблемы с помощью матрицы и обеспечить правильный порядок элементов при переходе матрицы к shader, вы все равно можете использовать реализацию вашей матрицы. Просто помните, что элементы 12, 13 и 14 сохраняют перевод. Если вы путаетесь со всеми статьями, связанными со строками, то читайте this короткую статью об этом, которая объясняет это очень хорошо. Я очень рекомендую.

Смежные вопросы