Как достичь glOrthof в OpenGL ES 2.0 - PullRequest
       0

Как достичь glOrthof в OpenGL ES 2.0

8 голосов
/ 06 сентября 2011

Я пытаюсь преобразовать мое приложение OpenGL ES 1 в приложение OpenGL ES 2, чтобы иметь возможность использовать шейдеры. Теперь я использую функцию glOrthof, чтобы иметь «область просмотра реального размера», чтобы я мог размещать вершины в «фактическом» пикселе в представлении OpenGL.

glOrthof(0, _frame.size.width, _frame.size.height, 0, -1, 1);

У меня проблемы с поиском, как добиться этого в OpenGL ES 2, есть кто-нибудь, кто может показать мне, как это сделать?

Если нет, есть ли у кого-нибудь ссылка на хороший OpenGL ES 1 to OpenGL ES 2 учебник / объяснение?

Ответы [ 2 ]

12 голосов
/ 06 сентября 2011

Метод glOrtho делает только создание новой матрицы и умножает текущую матрицу проекции на эту матрицу.С OpenGL ES 2.0 вы должны сами управлять матрицами.Чтобы повторить поведение glOrtho, вам нужна униформа для матрицы проекции в вашем вершинном шейдере, с которой вы затем умножаете свои вершины.Обычно у вас также есть модель и матрица вида (или комбинированная матрица вида модели, как в OpenGL ES 1), с которой вы преобразуете свои вершины перед преобразованием проекции:

uniform mat4 projection;
uniform mat4 modelview;

attribute vec4 vertex;

void main()
{
    gl_Position = projection * (modelview * vertex);
}

Специальная матрица проекции, которая glOrtho конструкции можно найти здесь .

10 голосов
/ 06 сентября 2011

Как описывает Кристиан, вся математическая математика для обработки ваших вершин зависит от вас, поэтому вы должны повторить матрицу, которую создает glOrthof(). В своем ответе здесь я предоставил следующий метод Objective-C для генерации такой матрицы ортографической проекции:

- (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)right bottom:(GLfloat)bottom top:(GLfloat)top near:(GLfloat)near far:(GLfloat)far;
{
    GLfloat r_l = right - left;
    GLfloat t_b = top - bottom;
    GLfloat f_n = far - near;
    GLfloat tx = - (right + left) / (right - left);
    GLfloat ty = - (top + bottom) / (top - bottom);
    GLfloat tz = - (far + near) / (far - near);

    matrix[0] = 2.0f / r_l;
    matrix[1] = 0.0f;
    matrix[2] = 0.0f;
    matrix[3] = tx;

    matrix[4] = 0.0f;
    matrix[5] = 2.0f / t_b;
    matrix[6] = 0.0f;
    matrix[7] = ty;

    matrix[8] = 0.0f;
    matrix[9] = 0.0f;
    matrix[10] = 2.0f / f_n;
    matrix[11] = tz;

    matrix[12] = 0.0f;
    matrix[13] = 0.0f;
    matrix[14] = 0.0f;
    matrix[15] = 1.0f;
}

Матрица, используемая здесь, определяется как

GLfloat orthographicMatrix[16];

Затем я применяю матрицу в моем вершинном шейдере, используя что-то вроде следующего:

gl_Position = modelViewProjMatrix * position * orthographicMatrix;

Мой порядок умножения отличается от порядка Кристиана, поэтому я могу сделать что-то немного назад, но это то, что я использовал для обработки этого в моем приложении OpenGL ES 2.0 (исходный код которого можно найти здесь ).

...