GLSL Ортогональная проекционная матрица не работает так, как она должна - PullRequest
0 голосов
/ 09 ноября 2011

Когда я пытаюсь использовать свою орфографическую проекцию, я не получаю требуемый результат. У меня есть VBO, содержащий следующие 2D вершины и texcoords (каждая вторая строка):

0, 0,
0.0, 0.0,
512, 0,
1.0, 0.0,
512, 512,
1.0, 1.0,
0, 512,
0.0, 1.0

На данный момент я рисую их, используя glDrawArrays(GL_TRIANGLE_FAN, 0, 4); Кажется, с VBO проблем не возникает (я проверял это в gDEBugger), вместо этого проблема, похоже, заключается в вершинном шейдере.

Это шейдер-нарушитель:

#version 420

uniform mat4 projection;
uniform mat4 modelview;

layout(location = 0) in vec2 vertex;
layout(location = 1) in vec2 texcoord;

out vec2 f_texcoord;

void main() {
    const float right = 800.0;
    const float bottom = 600.0;
    const float left = 0.0;
    const float top = 0.0;
    const float far = 1.0;
    const float near = -1.0;

    mat4 testmat = mat4(
        vec4(2.0 / (right - left), 0, 0, -(right + left) / (right - left)),
                    vec4(0, 2.0 / (top - bottom), 0, -(top + bottom) / (top - bottom)),
                    vec4(0, 0, -2.0 / (far - near), -(far + near) / (far - near)),
                    vec4(0, 0, 0, 1)
    );
    gl_Position = testmat * vec4(vertex, 0.0, 1.0);
    f_texcoord = texcoord;
}

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

Вот изображение, иллюстрирующее проблему: (Обратите внимание, что текстура имеет прозрачные части.)

image

EDIT: Вот как это выглядит с измененными значениями:

image

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Матрицы в GLSL: основной столбец . Первый vec4 должен быть первым столбцом , а не первым рядом. Последняя координата должна быть нулевой.

mat4 testmat = mat4(
    vec4(2.0 / (right - left), 0, 0, 0,
    vec4(0, 2.0 / (top - bottom), 0, 0),
    vec4(0, 0, -2.0 / (far - near), 0),
    vec4(-(right + left) / (right - left), -(top + bottom) / (top - bottom), -(far + near) / (far - near), 1)
);

Используется стандартное преобразование OpenGL glOrtho. Начало координат будет слева внизу, + X направо и + Y вверх. Это стандартно для OpenGL.

Если вы хотите, чтобы начало в верхнем левом углу уменьшалось с + Y, вам необходимо соответствующим образом настроить матрицу.

Мой код для этого следующий:

Translate(-1.0f, 1.0f, (depthRange.x + depthRange.y) / 2.0f);
Scale(2.0f / size.x, -2.0f / size.y, 1.0f);

Где depthRange.x/y - значения zNear / zFar. size.x/y - ширина / высота окна. Translate создает матрицу перевода, а Scale создает матрицу масштабирования (они умножаются вправо друг на друга).

0 голосов
/ 29 февраля 2016

проблема в том, что матрица умножается.изменить:

testmat * vec4(vertex, 0.0, 1.0);

на:

vec4(vertex, 0.0, 1.0) * testmat;
...