OpenGL: Quads, похоже, не отбракован должным образом

Я построил простую сцену, подобную следующей:

Сцена

Проблема в том, что синяя форма ниже, чем красная, но каким-то образом проходит через нее. Это выглядит правильно, когда я поворачиваю его следующим образом:

Сцена повернута

Из того, что я искал, это может быть связано с порядком отправляемых вершин, и вот мое определение для них:

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);

0

Решение

Вы должны включить тест глубины, выборку лица и альфа-тестирование отдельно.

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

Они не флаги. Вы не можете использовать их таким образом.

1

Другие решения

Увидеть 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.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector