Рисование фигур

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

Здесь мы покажем как нарисовать фигуры, описанные в предыдущем уроке, используя API OpenGL ES 2.0.

Инициализация фигур

Прежде чем что-либо нарисовать, вы должны инициализировать и загрузить фигуры в план. Если структура (оригинальные координаты) фигуры, не меняется в процессе выполнения программы, для эффективного расхода памяти вы должны инициализировать ее в методе onSurfaceCreated() объекта renderer.

Рисуем фигуры

Рисование описанных фигур с помощью OpenGL требует значительного количества кода, поскольку нужно предоставить много информации о деталях визуализации. Конкретно, вы должны описать следующее:

  • Шейдер вершин – графический код OpenGL для визуализации вершин фигуры.
  • Шейдер фрагмента – код OpenGL для визуализации лицевой стороны фигуры с цветами и текстурами.
  • Программа – объект OpenGL, который содержит шейдеры, которые вы хотите использовать для рисования одной или нескольких фигур.

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

Шейдеры содержат код на языке GLSL(OpenGL Shading Language), который должен быть скомпилирован прежде, чем может быть использован в среде OpenGL ES. Для компиляции этого кода, создайте метод в классе renderer:

Для того, чтобы нарисовать фигуру, вы должны скомпилировать код шейдера и добавить его в объект программы OpenGL. Так как это делается один раз, лучше всего поместить это в конструктор объекта рисования.

Примечание: Компиляция шейдеров и присоединение их к программе, это дорогая для CPU операция, поэтому вы должны избегать ее выполнения более одного раза. Если вы не знаете состав шейдеров во время выполнения программы, постройте свой код так, чтобы они создавались однократно, а затем сохранялись в кэше для последующего использования.

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

Создайте метод draw() для рисования фигуры. Приведенный ниже код устанавливает позицию и цвет шейдеров вершин и фрагментов для фигуры:

Теперь имея приведенный код, для рисования требуется всего лишь вызвать метод draw() из метода объекта renderer onDrawFrame(). После запуска приложения вы должны увидеть что-то подобное:

Рисунок 1. нарисованный треугольник без использования проекции и камеры.

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

И наконец, треугольник не двигается, что несколько скучно. Немного позже мы расскажем как вращать фигуры и делать другие интересные вещи с помощью OpenGL ES.

Добавить комментарий