OpenGL z значение.Почему отрицательное значение впереди? - PullRequest
0 голосов
/ 04 июня 2018

Opengl имеет правую систему координат.Это означает, что значения z увеличиваются по отношению ко мне.

правая система координатright-hand coordinate system

Я рисую два треугольника:

float vertices[] =
{
     //position                     //color
     //triangle 1
     0.0f,  1.0f, -1.0f,            1.0f, 0.0f, 0.0f,//0
    -1.0f, -1.0f, -1.0f,            1.0f, 0.0f, 0.0f,//1
     1.0f, -1.0f, -1.0f,            1.0f, 0.0f, 0.0f,//2
     //triangle 2
     0.0f, -1.0f, 0.0f,             0.0f, 0.0f, 1.0f,//3
     1.0f,  1.0f, 0.0f,             0.0f, 0.0f, 1.0f,//4
    -1.0f,  1.0f, 0.0f,             0.0f, 0.0f, 1.0f//5
};

Почему треугольник 1 впереди?Треугольник 2 должен быть впереди, потому что 0.0f> -1.0f.

У меня есть только gl_Position = vec4(aPos, 1.0); в вершинном шейдере.

После него, если я перевожу вершины на z = -3в вершинном шейдере этот перевод ведет себя так, как и должно быть.Объект становится дальше.

1 Ответ

0 голосов
/ 04 июня 2018

Почему треугольник 1 впереди?Треугольник 2 должен быть впереди, потому что 0.0f> -1.0f.У меня есть только gl_Position = vec4(aPos, 1.0); в вершинном шейдере.

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

. Это приводит к тому, что вершины равны нормализованным координатам пространства устройства.В нормализованном пространстве устройства ось z указывает на область просмотра, а «проекция» является ортогональной, а не перспективной.

Вы должны сделать что-то вроде этого:

in vec3 aPos;
mat4 modelProjectionMatrix;

void main()
{
    gl_Position = modelProjectionMatrix * vec4(aPos, 1.0);
}
...