Я построил простую сцену, подобную следующей:
Проблема в том, что синяя форма ниже, чем красная, но каким-то образом проходит через нее. Это выглядит правильно, когда я поворачиваю его следующим образом:
Из того, что я искал, это может быть связано с порядком отправляемых вершин, и вот мое определение для них:
Shape* Obj1 = new Quad(Vec3(-5.0, 5.0, 0.0), Vec3(5.0, 5.0, 0.0), Vec3(5.0, 5.0, -10.0), Vec3(-5.0, 5.0, -10.0));
Shape* Obj2 = new Quad(Vec3(-5.0, 3.0, 0.0), Vec3(5.0, 3.0, 0.0), Vec3(5.0, 3.0, -10.0), Vec3(-5.0, 3.0, -10.0));
Класс Vec3 содержит 3 двойных для координат x, y, z. Я добавляю эти классы Vec3 к вектору и перебираю их, когда хочу нарисовать, как таковой:
glBegin(GL_QUADS);
for (auto it = vertex_list.begin(); it != vertex_list.end(); ++it)
glVertex3d(it->get_x(), it->get_y(), it->get_z());
glEnd();
Наконец, мои настройки:
glEnable(GL_ALPHA_TEST | GL_DEPTH_TEST | GL_CULL_FACE);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glAlphaFunc(GL_GREATER, 0.0f);
glViewport(0, 0, WINDOW_X, WINDOW_Y);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0f, 300.0);
// camera origin xyz, point to look at xyz, camera rot xyz
gluLookAt(10, 10, -20, 2.5, 2.5, -10, 0, 1, 0);
Вы должны включить тест глубины, выборку лица и альфа-тестирование отдельно.
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
Они не флаги. Вы не можете использовать их таким образом.
Увидеть glEnable
:
glEnable
— включить или отключить возможности GL на стороне сервераvoid glEnable(GLenum cap);
cap
Определяет символическую константу, обозначающую возможность GL.
Это означает, что параметр glEnable
является константой, а не набором битов и GL_ALPHA_TEST
, GL_DEPTH_TEST
, GL_CULL_FACE
являются символическими константами, а не битами набора битов.
Измените свой код следующим образом:
glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
Увидеть Спецификация OpenGL — 17.3.4 Тест буфера глубины, с. 500:
17.3.4 Тест буфера глубины
Тест буфера глубины отбрасывает входящий фрагмент, если сравнение глубины не удается. Сравнение включается или отключается общими командами Enable и Disable с использованием target DEPTH_TEST.
Увидеть Спецификация OpenGL — 14.6.1 Базовая растризация полигонов, с. 473:
Отбраковка включается или отключается путем вызова Enable или Disable с целевым CULL_FACE.