В данной программе будет использован алгоритм удаления невидимых поверхностей, получивший в литературе название алгоритма z-буфера (z-buffer algorithm), который поддерживается в OpenGL. Существуют средства управления этим алго-

Трехмерный узор Серпинского

2.9. Трехмерный узор Серпинского ритмом, позволяющие легко отключать или включать его. В функции main() нужно запросить дополнительную память для работы этого алгоритма - z-буфер или буфер глубины. Это выполняется спецификацией константы GLUT_DEPTH при вызове функции glutInitDisplayMode():

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

Разрешается выполнение алгоритма вызовом функции glEnable() с константой GL_DEPTH_TEST в качестве аргумента:

glEnable(GL_DEPTH_TEST)

Фрагмент с операторами настройки включается либо в файл main.с, либо в функцию инициализации (файл myinit.c). Поскольку алгоритм хранит информацию в буфере глубины, его требуется очищать перед формированием каждого нового изображения. Очистка выполняется в той части функции отображения, где инициализируются параметры процесса:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Функция отображения display () теперь примет вид void display() {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
tetrahedron(n);
glFlush();
}

Результат ее выполнения после пяти циклов показан на рис. 2.39 и на ил. 2 цветной вклейки. Полный текст программы приведен в приложении А.

Рис. 2.39. Трехмерный узор Серпинского после выполнения пяти циклов рекурсивной процедуры

2.10. Резюме В этой главе читатели познакомились с основными характеристиками API OpenGL и с тем, как в этой системе реализуются базовые концепции, представленные в главе 1. Хотя первое из рассмотренных в этой главе приложений и является двухмерным, мы все время обращали ваше внимание на то, что двухмерная графика в OpenGL - это только частный случай трехмерной. Было показано, как с минимальными усилиями распространить результаты, полученные для двухмерного случая, на трехмерный вариант постановки задачи.

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


⇐ Предыдущая| |Следующая ⇒