Продолжаем знакомиться с OpenGL. В прошлой статье я познакомил тебя с инициализацией и двумя примитивами: точки и линии. Сегодня ты ещё немного узнаешь о примитивах и познакомишся с тестом глубины.
Загрузи проект из прошлой статьи и исправь процедуру FormPaint вот так (если у тебя нет исходников прошлого занятия, то возьми уже готовые здесь):
Если ты запустишь сейчас программу, то увидишь нечто похожее на рисунок 1. Что же нового произошло? Во-первых это очистка экрана:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Я включил сюда очистку буфера глубины GL_DEPTH_BUFFER_BIT. Хотя глубину я ещё не использовал, но всё же сегодня я это сделаю.
Второе это glRotated(g,x,y,z). Эта функция поворачивает всю сцену на угол g, по осям x,y,z. В нашем случае сцена повернётся по оси X на 45 градусов. Если надо повернуть по оси y, то третий параметр нужно выставить в 1.
Эта конструкция рисует квадрат из четырёх точек. Так мы постепенно будем знакомиться со всеми возможными примитивами. В отличии от прошлой статьи, где я не использовал у вершин параметр Z, здесь я его использую. Поэтому наша сцена получилась трёхмерной.
Теперь ещё раз взгляни на результат работы программы, он немного не правильный. Два наших квадрата должны пересекаться в середине, но этого не происходит. Это связано с тем. Что не включён тест глубины. Для того, чтобы его включить, ты должен перед рисованием квадратов написать glEnable(GL_DEPTH_TEST). Подкорректируй свою программу (или мой исходник) вот так.
Теперь у тебя получится правильная сцена, как на рисунке 2. Для того, чтобы регулировать функцией, отвечающей за тест глубины, ты можешь воспользоваться процедурой glDepthFunc. В качестве параметров ты можешь передавать следующие значения:
GL_NEVER - тест не выполнится никогда
GL_LESS - тест выполнится, если текущее значение Z меньше чем сохранённое.
GL_EQUAL - тест выполнится, если текущее значение Z равно сохранённому.
GL_LEQUAL - тест выполнится, если текущее значение Z меньше или равно сохранённому.
GL_GREATER - тест выполнится, если текущее значение Z больше сохранённого.
GL_NOTEQUAL- тест выполнится, если текущее значение Z не равен сохранённому.
GL_GEQUAL - тест выполнится, если текущее значение Z больше или равен сохранённому.
GL_ALWAYS - тест выполнится всегда.
Эти функции ты можешь включать после включения теста глубины. Например:
glEnable(GL_DEPTH_TEST);
glDepthFunc(glLess);
Попробуй поиграть с этими функциями, а я удаляюсь. Увидимся в следующем номере.