Инициализация библиотек и вывод примитивов
Рис. 22.5. Смешивание цветов граней Итак, если полупрозрачная грань находится уже в буфере цвета, то там она становится полностью непрозрачной. Если выводить после нее непрозрачную грань, расположенную дальше от наблюдателя, то она не будет просвечиваться.
Борьба с этим недостатком возлагается на разработчика. При перемещении наблюдателя в виртуальном мире следует сначала нарисовать все непрозрачные грани, потом отсортировать прозрачные грани по расстоянию от наблюдателя и вывести их на экран, начиная с дальней грани. Часто рекомендуется вместо сортировки полупрозрачных граней выключить во время их вывода запись в Z-буфер. При этом ни одна полупрозрачная грань не сможет исключить из конвейера фрагменты другой грани на этапе теста глубины.
Приложения, демонстрирующие полупрозрачность, находятся в папках OpenGL_blend и Шар_и_Пирамида.
Типы примитивов При выводе двух независимых треугольников по шести заданным вершинам рисуются два треугольника. Если по этим вершинам необходимо нарисовать шестиугольник, то использование примитива GL__TRIANGLES потребует задать 12 вершин - по три вершины для каждого из четырех треугольников. При этом каждую вершину придется передавать в графическую библиотеку дважды. В OpenGL предусмотрены различные типы примитивов, позволяющие нарисовать шестиугольник, используя массив из шести вершин. Программист может использовать примитив GL_P0LYG0N, выполняющий рисование многоугольника, или представить шестиугольник как одну фигуру, составленную из связанных различными способами треугольников и четырехугольников. Можно представить шестиугольник как четыре треугольника, имеющих одну общую вершину, когда треугольники составлены веером. Подобное представление реализует примитив GL_TRIANGLE_FAN. Можно реализовать шестиугольник как полосу, составленную из четырехугольников, связанных общими ребрами, использовав для этого примитив GL_QUAD_STRIP. Или даже можно представить эту фигуру как полосу, в которой каждый четырехугольник разбит на два треугольника, использовав для этого примитив GL_ TRIANGLE _STRIP.