glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER. GL_TRUE):

Правильно ли происходит закрашивание обеих сторон полигона? Каждая полигональная грань модели имеет две стороны. При моделировании мы привыкли называть эти стороны «внутренней» и «внешней» поверхностями. Принято заносить эти вершины в список против часовой стрелки, если смотреть с внешней стороны объекта. Большинство каркасных объектов представляют сплошные тела, ограничивающие некоторое пространство, так что четко определены понятия внешней и внутренней стороны. Для таких объектов камера может наблюдать только внешнюю поверхность каждой грани (если, конечно, сама камера не находится внутри объекта!). При правильном удалении невидимых поверхностей внутренняя поверхность каждой грани скрыта от глаза какой-нибудь более близкой гранью.

В OpenGL нет понятия «внутри» и «снаружи», он может различать только «лицевые грани» и «нелицевые грани». Грань является лицевой (front face), если ее вершины расположены в списке против часовой стрелки, в том порядке, каком их видит глаз1. На рис. 8.21, а показан куб - таким, каким его видит глаз, если принято соглашение о нумерации против часовой стрелки. Стрелками показан тот порядок, в каком вершины каждой грани передаются в OpenGL (в блоке glBegin(GL_POLYGON) ; ... : glEndO). Для объекта, ограничивающего некоторое пространство, все грани, которые видит глаз, являются лицевыми, и OpenGL правильно рисует и закрашивает их. Нелицевые грани2 также рисуются в OpenGL, но в конце концов они скрываются за более близкими лицевыми гранями.

Иначе обстоит дело на рис. 8.21, б, где показан параллелепипед с одной удаленной гранью. Как и раньше, стрелками показан порядок, в котором вершины каждой грани пересылаются в графический конвейер. Три из видимых граней являются нелицевыми. По умолчанию OpenGL не может правильно закрасить эти грани. Для правильного закрашивания нелицевых граней нужно проинструктировать OpenGL с помрщью оператора


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