М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 20
Текст из файла (страница 20)
Функция В1РорС1)ептдттг)Ь() восстанавливает значения параметров состояний, ранее сохраненных послед- ним вызовом В1РцзПС1)епгдгсг)Ь(). В табл. 2 7 приведен список символиче- ских имен для битов маски; они могут быть объединены логическим ИЛИ, что позволяет сохранять любую комбинацию клиентских атрибутов. Две клиентские группы атрибутов, обратной связи и выбора, не могут быть сохранены или восстановлены с помощью стека. Таблица 2.7.
Клиентские группы атрибутов Маска Группы БС СС1ЕМТ Р1ХЕС 5ТОРЕ В1Т БС СС1ЕМТ ЧЕРТЕХ АРКАУ В1Т 6С АСС ССЕЕМТ АТТР1В В1Т5 Не могут быть сохранены или восстановлены Не могут быть сохранены или восстановлены Хранение пикселов Массив вершин Обратная связь Выбор бг АССОМ ВОЕЕЕР В)Т БС АСС АТТй1В В1Т5 бг СОСОК ВОЕЕЕР В1Т БС СОййЕМТ В1Т 6( ОЕРТН ВОЕЕЕР В1Т 6( ЕМАВСЕ В1Т БС ЕЧАС В!Т БС Е06 В1Т БС Н1МТ В1Т БС (16НТ1МБ В!Т БС С!МЕ В1Т бб (151 В1Т 6( МОСТ15АМРСЕ В!Т БС Р1ХЕС МОВЕ В1Т 6( Р01МТ В1Т 61 РОГУБОМ В1Т 6( РО!УБОМ 5Т1РРСЕ В1Т 6( 5П550й ВГТ БС 5ТЕМС11 ВОЕЕЕР В1Т 61 ТЕХТОРЕ В1Т БС ТРАМ5ЕОРМ ВЕТ БС Ч1ЕЧ)РОРТ В1Т Буфер цвета Текущий Буфер глубины Антивация Оценка Туман Подсказки Освещение Линия Список Множественная выборка Пиксел Точка Многоугольник Фактурный многоугольник Отсечение Буфер трафарета Текстура Деформация Точна наблюдения Несколько советов по построению полигональных моделей поверхностей 89 Несколько советов по построению полигональных моделей поверхностей Ниже рассмотрены несколько методов, применяемых при полигональной аппроксимации поверхностей.
Возможно, когда вы более подробно познакомитесь с освещением и списками отображения (главы 5 и 7), вам захочется еще раз вернуться к этой главе, поскольку это связанные темы. Условия освещения определяют внешний вид рисуемой модели, а некоторые из приведенных ниже приемов более эффективны в связке со списками отображения. Помните, что при вычислении освещенности для получения хорошего результата должны быть определены векторы нормалей. Полигональная аппроксимация поверхностей — это целое искусство, и ничто пе заменит опыта. Но мы постарались наполнить этот раздел несколькими «указателями», которые будут способствовать вам в легком старте.
° Соблюдайте непротиворечивую ориентацию многоугольников. Делайте так, чтобы при просмотре снаружи все многоугольники поверхности были ориентированы в одном направлении (все или по часовой стрелке, или против нее). Поддержка целостной ориентации многоугольников очень важна для отбраковки и при двухстороннем освещении. Попытайтесь следовать этому правилу с самого начала, это поможет избавиться от проблем в будущем. (Если используется функция а15са1е» () с целью отражения геометрических объектов симметрично относительно каких-то осей, следует сменить ориентацию с помощью функции ~1ГгопГГасе() для поддержания непротиворечивости.) ° При разбиении поверхностей следите за всеми нетрсугольными многоугольниками. Три вершины треугольника гарантированно лежат в одной плоскости, а уже для вершин четырехугольника такой гарантии цет.
Неплоские многоугольники с некоторых точек могут выглядеть пересекающими сами себя, и ОрепСЕ не сумеет правильно их отобразить. ° Всегда существует обратная зависимость между скоростью рисования и качеством изображения. Если разбить поверхность на небольшое число многоугольников, то отрисовка будет быстрая, но может появляться зубчатостгн если же сгенерировать миллионы многоугольников, надо думать, выглядеть это будет хорошо, но потребуется много времени на отрисовку.
Идеально — вволить специальный параметр в процедуры разбиения, определяющий, насколько хорошо требуется выполнять разбиение, и, если объект рисуется на глазах, можно будет огрубить разбиение. Также при разбиении используйте большие многоугольники там, где поверхность практически ровная, и маленькие— в областях с большой кривизной. ° Для высококачественных изображений нужно более детальное разбиение на границах, чем внутри.
Если поверхность поворачивается относительно глаза, границы тоже меняются. Границы появляются, когда векторы нормали перпендикулярны к вектору, направленному от поверхности к точке обзора. Это означает, что их вектор — нулевой. Алгоритм разбиения может выполнить дополнительное разбиение, если вектор в этой точке стремится к нулю. 90 Глава 2 ь Управление состоянием и рисование геометрических объектов ° Старайтесь избегать т-образных пересечений в моделях (рис. 2.16).
Как видно из рисунка, нет гарантии, что отрезки АВ и ВС рисуются теми же пикселами, что и отрезок АС. Иногда это происходит, иногда нет; в зависимости от преобразований и положения это может привести к периодическому появлению разрывов на поверхности.
Неподходящее Нормальное Рнс. 2.16. Нежелательные Т-образные пересечения ° При построении замкнутой поверхности убедитесь, что используете одинако вые числа для координат начала и конца контура, иначе на поверхности воз никнут разрывы из-за ошибок округления. Ниже приведен пример непра вильного кода для рисования двухмерной окружности: /* Не используйте этот кол '/ №Оет(пе Р1 3.14159265 №г)ет1пе Е06Е5 3 В /* рисуем окружность '/ а1веа!п(6( Е1МЕ 5ТР1Р); Рог (з = В; 1 <= Е06Е5; !.ьь) Х(уегтех2((соз((2*Р1'))/Е06Е5), з(п((2*Р1'))/Е06Е5)); а(Епе(); Ребра сомкнутся, только если компьютер в силах вычислить одинаковое зна четше для синуса и косинуса нуля и значения (2'Р1*Е06Е5/Е06Е5).
При все доверии к вычислениям с плавающей запятой, авторы желают вам только луч щего... Для исправления этого кода нужно при г - Е()СЕЯ подставить для си нуса и косинуса значение О, а не 2'Р1*Е06Е5/ЕООЕ5. (Или просто можно ис пользовать 6Е Е1МЕ ЕООР, а не 6Е 11МЕ 5ТМ1Р, и прерывать цикл по услови т < Е06Е5.) Пример: построение икосаэдра с1тобея проиллюстрировать некоторые из изложенных выше советов по аппро симации поверхностей, рассмотрим код рисования икосаэдра. Икосаэдр, будуч Платоновым телом из 20 треугольных граней и 12 вершин, является хороше приблизительной аппроксимацией сферы.
Программа из листинга 2.16 определяет вершины и треугольники, составляющи икосаэдр, а затем его рисует. Несколько советов по построению полигональных моделей поверхностей 91 Листинг 2.16. Рисование икосаэдра Воет(пе Х .525731112119133696 Вает(пе 2 .850650808352039932 зтзс!с 6ьт]оат чаата[12)[Э] (-Х, 0.0, 2», (Х, 9.0, 2), (-Х, О.О, -2), (О.В, 2, Х), (О.О, 2, -Х», (О.О, -2, Х», (2, Х, 0.9», (-2, Х, 0.0), (2, -Х, 0.0), )' зтат(с 6ьц(п1 11пачсез[20] [3] = ( (1,4,0), (4,9,0), (4,5,9», (8,5,4), (1,8,4», (1,10,8), (10,3,8), (8,3,5), (3,2,5), (Э,7,2», (Э,10,7), (10,6,7), (6,11,7), (6,0,11), (6,1,0], (10,1,6), (11,0,9), (2,11,9), (5,2,9), (11,2,7] (Х, 8.0, -2». (0.0, -2, -Х», (-2, -Х. 0.9) !пт [; 818ей(п(66 тя1Ан6665); Гог (! = 9; ! < 20; (н-) ( /* информация о цвете должна быть здесь */ 8]уег!ехэтч(йчаата[С(па!сев[(][О]][0]); 81чегтехЭ(ч(йчбата [ 1! пе! сев [! ] [ 1] ] [9] ): 8]уегтехэтч (йчбата [1! па! сев [! 1 [2] 1 [9] ); 8!Ело(); Странные числа Х и 2 были выбраны таким образом, чтобы расстояние от начала координат до любой вершины составляло 1,0.
Координаты всех 12 вершин определены в массиве одЫа[~ Ц, причем нулевая вершина — ( — Х, 0.0, Х), первая — (Х, 0.0, У) и т. д. Массив 1[лг[(сезЦ Ц определяет, как вершины связываются в треугольники. Например, первый треугольник состоит из нулевой, четвертой и первой вершин. Нри указании вершин в приведенном порядке все треугольники приобретут одинаковую ориентацию.
Строку с информацией о цвете следует заменить командой, определяющей цвет !-й грани. Если на ато место не вставить никакого кода, все грани будут нарисованы одним цветом и нельзя будет разглядеть трехмерный объект. Альтернативой определения цвета для каждой грани является определение векторов нормалей и использование освещения, как описано в следующем разделе. Вычисление векторов нормали к поверхности Если поверхность освещена, необходимо определить вектор нормали к поверх- ности. Вычисление нормализованного векторного произведения двух векторов ПРИМЕЧАНИЕ Во всех примерах, приведенных в этом разделе, нужно сохранять вычисленные значения вершин и нормалей до тех пор, пока поверхность не нарисована, так как эти вычисления не нужно выполнять при каждом рисовании поверхности.
Для сохранения подойдут как собственные структуры данных, так и списки отображения (см. главу 7). 92 Глава 2 ° Управление состоянием и рисование геометрических объектов к поверхности дает вектор нормали. На плоской поверхности икосаэдра все три вершины, определяющие поверхность, имеют одинаковые векторы нормалей. В зтом случае достаточно вычислить одну нормаль для каждого набора из трех вершин, Код в листинге 2.17 может заменить строку «информация о цветес.е в листинге 2.16. Листинг 2.17.