пятница, 31 июля 2009 г.

Особенности вывода текста в OpenGL

Изобразить на экране красивые буковки в OpenGL не очень сложно. Для этого нужно:
  • создать шрифт: CreateFont(.....);
  • «привязать» контекст устройства: SelectObject(.....);
  • преобразовать шрифт в полигоны: wglUseFontOutlines(.....).
Теперь эти полигоны можно текстурировать и отображать - как и другие объекты сцены. Но, имеет эта простота одну особенность, из-за непонимания которой я долго не мог достичь поставленной цели: вместе с флагом отображать на экране текст.
Дело в том, что функция wglUseFontOutlines помещает шрифтовые полигоны в список отображения (для каждого символа получается как бы подпрограмма его вывода). По умолчанию OpenGL считает лицевыми те полигоны, рисование которых происходит ПО часовой стрелке — именно в таком порядке обходят вершины шрифтового полигона эти стандартные подпрограммки. А мне, рисуя флаг, было удобнее обходить прямоугольники, из которых он состоит, ПРОТИВ часовой стрелки. Чтобы OpenGL считал такие полигоны лицевыми, я при инициализации вызвал функцию glFrontFace(GL_CCW). Пока в сцене не было текста, она выглядела нормально, а когда направление рисования полигонов флага и текста не совпало, на изображении возникли серьезные артефакты. Стоило перед выводом текста поменять порядок обхода для лицевых полигонов: glFrontFace(GL_CW), а после — переназначить обратно: glFrontFace(GL_CCW), как изображение пришло в норму.

Вывод: не забывайте, что OpenGL очень чувствителен к порядку обхода вершин полигона.

Комментариев нет:

Отправить комментарий

Можете оставить комментарий: