Как преобразовать мировые координаты в экранные координаты в OpenGL ES 2.0 - PullRequest
2 голосов
/ 17 октября 2011

Я использую следующий код OpenGL ES 1.x для установки координат моей проекции.

glMatrixMode(GL_PROJECTION); 

float width = 320;
float height = 480;

glOrthof(0.0,                  // Left
         1.0,                  // Right
         height / width,       // Bottom
         0.0,                  // Top
         -1.0,                 // Near
         1.0);                 // Far
glMatrixMode(GL_MODELVIEW);

Каков эквивалентный метод для настройки этого в OpenGL ES 2.0? Какую матрицу проекции я должен передать вершинному шейдеру?

Я попытался использовать следующую функцию для создания матрицы, но она не работает:

void SetOrtho (Matrix4x4& m, float left, float right, float bottom, float top, float near, 
float far)
{
    const float tx = - (right + left)/(right - left);
    const float ty = - (top + bottom)/(top - bottom);
    const float tz = - (far + near)/(far - near);

    m.m[0] = 2.0f/(right-left);
    m.m[1] = 0;
    m.m[2] = 0;
    m.m[3] = tx;

    m.m[4] = 0;
    m.m[5] = 2.0f/(top-bottom);
    m.m[6] = 0;
    m.m[7] = ty;

    m.m[8] = 0;
    m.m[9] = 0;
    m.m[10] = -2.0/(far-near);
    m.m[11] = tz;

    m.m[12] = 0;
    m.m[13] = 0;
    m.m[14] = 0;
    m.m[15] = 1;
}

Вершинный шейдер:

uniform mat4 u_mvpMatrix;

attribute vec4 a_position;
attribute vec4 a_color;

varying vec4 v_color;

void main()
{
   gl_Position = u_mvpMatrix * a_position;
   v_color = a_color;
}

Код клиента (параметры для вершинного шейдера):

float min = 0.0f;
float max = 1.0f;
const GLfloat squareVertices[] = {
    min, min,
    min, max,
    max, min,
    max, max
};
const GLfloat squareColors[] = {
    1, 1, 0, 1,
    0, 1, 1, 1,
    0, 0, 0, 1,
    1, 0, 1, 1,
};
Matrix4x4 proj;
SetOrtho(proj, 0.0f, 1.0f, 480.0/320.0, 0.0f, -1.0f, 1.0f );

Вывод, который я получаю в симуляторе iPhone:

enter image description here

1 Ответ

1 голос
/ 17 октября 2011

Ваша транскрипция формулы glOrtho выглядит правильно.

Ваш класс Matrix4x4 является пользовательским, но возможно ли, что mm будет загружен непосредственно как glUniformMatrix4fv?Если это так, убедитесь, что вы устанавливаете флаг транспонирования как GL_TRUE, так как вы загружаете данные в основном формате строки, а OpenGL ожидает основной столбец (т. Е. Стандартными правилами является то, что индекс [0] является вершиной первого столбца, [3] внизу первого столбца, [4] вверху второго столбца и т. д.).

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

...