Канонический объем представления, или нормализованные координаты устройства, является / левосторонним.Это легко проверить, передав матрицу тождеств и нарисовав 2 треугольника, скажем
float points[] = { -1, 1, -0.5,
-1, -1, -0.5,
1, -1, -0.5,
1, 1, 0.5,
-1, -1, 0.5,
1, -1, 0.5 };
и посмотрев на результаты (с glEnable (GL_DEPTH_TEST))
Таким образом, ваш вершинный шейдер будет выглядеть следующим образом:
uniform mat4 mvp_mat;
// Incoming per vertex... position (fills in 1 for w if from vec3 buf)
layout (location = 0) in vec4 v_vertex;
void main(void)
{
// multiplying by identity doesn't transform the geometry
gl_Position = mvp_mat * v_vertex;
}
или вы можете даже проверить это более просто, так как единичная матрица ничего не делает
layout (location = 0) in vec4 v_vertex;
void main(void)
{
//no transformation, no confusion, just straight to OpenGL
gl_Position = v_vertex;
}
Очевидно, вам придется сделать цвета треугольников разными, чтобы выМожно увидеть, как они перекрываются.
Также см. этот пост и мой комментарий / вопрос в нем: plus.google.com/114825651948330685771/posts/AmnfvYssvSe
Я не знаю, где все неправильноинформация поступает из Интернета и даже из учебников.OpenGL по умолчанию правша, только если вы говорите об обмотке треугольника для определения передней грани (CCW по умолчанию = правша).Пространство мира, пространство объектов и пространство глаз не существуют для OpenGL, только для графического программиста.OpenGL просто берет точки, обрезает что-либо вне объема канонического представления [-1, -1, -1] x [1, 1, 1] и преобразует их в координаты экранного пространства / окна, которые по умолчанию равны [0, w) x [0, h) x [0, 1].Если проверка глубины включена, поведение по умолчанию - левша, глядя вниз + z.
Существует несколько способов учета левши OpenGL.Большинство людей обрабатывают это в своих матрицах (хотя они не осознают этого).Я думаю, что вы также можете изменить его, используя glDepthFunc и установив его в GL_GREATER.
http://www.opengl.org/sdk/docs/man3/xhtml/glDepthFunc.xml
Еще одно доказательство того, что это левша, здесь http://www.opengl.org/sdk/docs/man3/xhtml/glDepthRange.xml
"Послеотсечение и деление на w, координаты глубины находятся в диапазоне от -1 до 1, что соответствует ближнему и дальнему плоскостям отсечения ", т. е. положительный z попадает на экран = левша.Вы также можете использовать DepthRange, чтобы перейти к правостороннему поведению.
РЕДАКТИРОВАТЬ: В ответ на настойчивое требование Боба Кросса, что я не прав, приведу программу с одним исходным файлом, которая показывает, что я прав.https://github.com/rswinkle/opengl_reference/blob/master/src/left_handed.c
Вы можете увидеть скриншот в README https://github.com/rswinkle/opengl_reference