6 апреля 2012 г.

OpenGL ES 1. Как наложить несколько текстур на один полигон

Иногда бывает необходимо нанести последовательно несколько текстур на один полигон в виде слоёв с регулируемой прозрачностью. Делается это с помощью смешивания цветов различных текстур. Для решения этой задачи нужно определить несколько материалов с различным значением альфа компоненты отраженного света и загрузить в память несколько текстур. Рассмотрим пример. Предположим, у нас загружены в память три текстуры с именами name1, name2, name3. Изображение первой текстуры представляет из себя красные вертикальные полосы, второй-зелёные горизонтальные полосы, а третьей - синий круг.

5 апреля 2012 г.

OpenGL ES 1. Текстуры в движении

До сих пор мы задавали для вершин полигонов фиксированные координаты текстур. В результате, текстура была как-бы "приклеена" к поверхности полигона. Однако, ничто нам не мешает изменять координаты текстуры вершин при смене кадров. Например, мы хотим чтобы текстура протекала по поверхности полигона. Как это можно реализовать ?
Двумерная текстура имеет две координаты S и T, аналогичные координатам X и Y на плоскости. S-это горизонтальная координата, T-вертикальная. Следует отметить, что разделение на вертикальную и горизонтальную координату условно и зависит какую из вершин полигона мы примем за начало текстурных координат. Кроме того, координаты текстур нормированы, т.е. находятся в диапазоне от 0 до 1. Достаточно с каждым новым кадром добавлять к координате S или T величину, намного меньше единицы, и увидим как текстура "поплывет". При этом рано или поздно текстурная координата выйдет за пределы единицы. Что при этом произойдет.

OpenGL ES 1. Зеркальное отражение при помощи кубических текстур

Кубическая текстура представляет из себя шесть фотографий окружающего пространства: "Правая сторона", "Левая сторона", "Верх", "Низ", "Передняя сторона", "Задняя сторона", которые должны быть подготовлены заранее. Всем шести картинкам присваивается одно имя текстуры и обращение идет к текстуре производится по данному имени. Для создания эффекта зеркального отражения используется автоматическая генерация текстур при помощи команды glTexGeni с параметром GL_REFLECTION_MAP. При этом каждой вершине полигона присваивается координата текстуры, соответствующая зеркальному отражению от поверхности полигона.
Автоматическая генерация текстур несмотря на высокую скорость расчета текстурных координат имеет свои недостатки. В частности, при перемещении камеры зеркальное отражение перемещается в месте с ней и расплывается. Чтобы избавиться от таких нежелательных эффектов, нужно изменять матрицу текстуры. Матрица текстуры - это аналог матрицы модели-вида, применяемый не к координатам вершин X, Y, Z, а координатам текстур S, T, R. Все операции, которые можно применить к матрице модели-вида, можно применять и к матрице текстуры, но действовать они будут на текстурные координаты. По умолчанию матрица текстуры равна единичной матрице. Чтобы зеркальное отражение выглядело корректно нужно компенсировать поворот и перемещение камеры. Для этого записываем в массив текущую матрицу модели-вида с учетом все поворотов и перемещений камеры, получаем из нее обратную матрицу модели-вида, а затем зануляем у обратной матрицы модели-вида элементы, связанные с перемещением. Результат всех этих манипуляций записываем в матрицу текстуры. Перед рисованием следующего полигона матрицу текстуры нужно снова превратить в единичную.

OpenGL ES 1. Как сделать текстуры прозрачными

В этой статье, основанной на предыдущем примере показано как сделать грани пирамиды полупрозрачными, рассмотрен вопрос о сортировке полигонов для правильного отображения эффекта прозрачности. Для этих целей будем использовать режим смешивания цветов при помощи альфа-компоненты цвета материла. Всего у цвета есть четыре компонента: красный, зеленый, синий и альфа. Яркость каждой компоненты изменяется в диапазоне от 0 до 1. Альфа компонент-это четвертый компонент цвета. Он определяет степень непрозрачности объекта. 
Альфа=0 - полностью прозрачный объект. Альфа=1 - полностью непрозрачный объект.

OpenGL ES 1. Текстурирование на примере

В данном примере показано как создать текстурированный многогранник в Android OpenGL ES на примере пирамид. Применен объектно-ориентированный подход. Пирамида разбита на отдельные самостоятельные объекты (полигоны) - треугольники и прямоугольник, внутри которых содержатся собственные свойства полигонов - координаты вершин и текстур, а также определен метод позволяющий вращать полигоны в пространстве.

4 апреля 2012 г.

OpenGL ES 1. Двумерные текстуры

Двумерная текстура представляет из себя прямоугольное графическое изображение, загруженное в память OpenGL. Текстура используется для нанесения изображения на поверхность, составленную из полигонов (многоугольников). Двумерная текстура имеет две координаты, горизонтальную координату принято обозначать буквой S, вертикальную - буквой T. Координаты текстуры нормированы на единицу, т.е. принимают значения от 0 до 1. Левый верхний угол картинки имеет координаты S=0, T=0, правый нижний угол - S=1, T=1:

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

3 апреля 2012 г.

OpenGL ES 1. Освещение и материалы

Освещение очень важно для правильного отображения трёхмерных объектов. Например, без освещения сфера будет выглядеть как круг, а цилиндр как прямоугольник. Чтобы использовать освещение нужно обязательно включить его командой glEnable(GL10.GL_LIGHTING), иначе все источники света будут игнорированы. В OpenGL ES допускается одновременно использовать восемь источников света, которые пронумерованы специальными параметрами состояния GL10.GL_LIGHT0, GL10.GL_LIGHT1, GL10.GL_LIGHT2, и.т.д. до GL10.GL_LIGHT7. Чтобы включить источник света нужно вызвать команду glEnable(номер источника света). Например, чтобы включить первый источник света вводим glEnable(GL10.GL_LIGHT1). По умолчанию включен источник света GL10.GL_LIGHT0. Аналогично можно выключить источник света командой glDisable(номер источника света). Каждый источник света имеет свои атрибуты, которые настраиваются независимо от других источников.

2 апреля 2012 г.

OpenGL ES 1. Применение индексов при обходе вершин

Применение команды glDrawArrays обязывает нас упорядочивать массивы координат вершин, нормалей и текстур в строго определённом порядке в соответствии с выбранным правилом обхода точек GL_TRIANGLES, GL_TRIANGLE_STRIP или GL_TRIANGLE_FAN. Это не всегда бывает удобно. Поэтому в OpenGL существует возможность разделить данные вершин и правила обхода по разным массивам. Специально подготовленный массив, в котором хранится порядок обхода вершин, называют массивом индексов. Рассмотрим применение индексов на простом примере.

1 апреля 2012 г.

OpenGL ES 1. Основы рисования для начинающих

Основным изображаемым объектом в OpenGL является вершина. Вершина-это точка в трёхмерном пространстве. Вершина имеет ряд атрибутов. Главными атрибутами вершины являются ее координаты X, Y, Z. В OpenGL принято, что относительно экрана, на который проецируется изображение, ось X направлена слева направо, ось Y-снизу вверх, ось Z-из глубины экрана к его поверхности. По умолчанию точка с координатами X=0, Y=0, Z=0 находится в центре экрана. Другими атрибутами вершины являются цвет, вектор нормали и координаты текстуры.