
- •OpenGl es для новичков
- •2.5 OpenGl es 2.0. Урок 5 Шейдер преломления света……………………………………… 60
- •1.1 OpenGl es в Android, класс glSurfaceView
- •1.2 OpenGl es 1. Основы рисования для начинающих
- •Aтрибут координат вершины.
- •Цвет как атрибут вершины.
- •Координаты вектора нормали.
- •1.3 OpenGl es 1. Применение индексов при обходе вершин
- •1.4 OpenGl es 1. Освещение и материалы
- •1.5 OpenGl es 1. Двумерные текстуры
- •1.6 OpenGl es 1. Текстурирование на примере
- •1.7 OpenGl es 1. Как сделать текстуры прозрачными
- •1.8 OpenGl es 1. Как наложить несколько текстур на один полигон
- •1.9 OpenGl es 1. Текстуры в движении
- •1.10 OpenGl es 1. Зеркальное отражение при помощи кубических текстур
- •2.1 OpenGl es 2.0. Урок первый-Шейдеры Введение в шейдеры.
- •Получение матриц.
- •Создание шейдерного объекта в OpenGl es 2.0
- •Передача данных униформ в шейдеры.
- •Передача атрибутов вершин в вершинный шейдер.
- •Класс шейдерного объекта.
- •2.2 OpenGl es 2.0. Урок второй - Освещение в шейдере
- •Фоновое (ambient) освещение.
- •Диффузное (diffuse) или рассеянное освещение.
- •Зеркальное (specular) или бликовое освещение.
- •Коды шейдеров.
- •Практика. Освещение плоской поверхности.
- •2.3 OpenGl es 2.0. Урок третий - Двумерные текстуры Загрузка текстуры из файла.
- •Доступ к текстурам из шейдера.
- •Получение цвета пикселя из текстуры.
- •Практика. Текстурированный квадрат.
- •Включаем свет.
- •2.4 OpenGl es 2.0. Урок 4. Гладкие поверхности. Полигональная сетка.
- •Расчет нормалей.
- •Разбиваем сетку на треугольники и рисуем поверхность.
- •Полный код класса рендерера, рисующего поверхность.
- •2.5 OpenGl es 2.0. Урок 5. Шейдер преломления света
Цвет как атрибут вершины.
Цвет имеет четыре компоненты-красную, зеленую и синюю и альфа. Яркость каждой компоненты можно регулировать в диапазоне от 0 до 1. Всё многообразие цветов можно представить в виде комбинаций красной, зелёной и синей компоненты различной яркости. Последнюю четвертую компоненту цвета называют Альфой. Альфа - это степень непрозрачности цвета. Если Альфа=0 цвет считается абсолютно прозрачным, т.е. невидимым. Если Альфа=1 цвет считается абсолютно непрозрачным. Цвет-это свойство вершины. Как передать цвет вершин в OpenGL ? С помощью тех же буферов. Сначала подготовим буфер для цвета. Каждая вершина имеет четыре значения цвета как числа с плавающей точкой. Каждое число с плавающей точкой занимает в памяти 4 байта. Таким образом, цвет одной вершины занимает в памяти 16 байт. Тогда для треугольника нужно создать буфер размером 16*3=48 байт. FloatBuffer colorBuffer;
ByteBuffer bb = ByteBuffer.allocateDirect(48); bb.order(ByteOrder.nativeOrder()); colorBuffer = bb.asFloatBuffer(); Запись цветов в буфер производится в следующем порядке: сначала красная компонента, затем зеленая, затем синяя и в конце альфа. Например, для треугольника выглядит так:
// цвет первой вершины - красный
float red1=1;
float green1=0;
float blue1=0;
float alpha1=1;
// цвет второй вершины - зелёный
float red2=0;
float green2=1;
float blue2=0;
float alpha2=1;
// цвет третьей вершины - синий
float red3=0;
float green3=0;
float blue3=1;
float alpha3=1;
// поставим текущую позицию в буфере на начало
colorBuffer.position(0);
// записываем в буфер цвета первой вершины colorBuffer.put(red1); colorBuffer.put(green1); colorBuffer.put(blue1);
colorBuffer.put(alpha1);
// записываем в буфер цвета второй вершины colorBuffer.put(red2); colorBuffer.put(green2); colorBuffer.put(blue2); colorBuffer.put(alpha2);
// записываем в буфер цвета третьей вершины colorBuffer.put(red3); colorBuffer.put(green3); colorBuffer.put(blue3); colorBuffer.put(alpha3);
// снова поставим текущую позицию в буфере на начало colorBuffer.position(0); Как альтернативу, можно сначала составить массив цветов треугольника, а затем записать массив в буфер:
float [] colorArray={1,0,0,1, 0,1,0,1, 0,0,1,1};
colorBuffer.position(0);
colorBuffer.put(colorArray);
colorBuffer.position(0);
Буфер цветов готов. Далее мы должны разрешить использование массивов цветов командой gl.glEnableClientState(GL10.GL_COLOR_ARRAY) и передать подготовленный буфер в OpenGL. Для передачи буфера в OpenGL служит команда glColorPointer:
gl.glColorPointer(4,GL10.GL_FLOAT,0,colorBuffer);
Первый аргумент 4 - количество цветов на вершину. Каждая вершина имеет четыре компоненты цвета (красный, зеленый, синий и альфа). Второй аргумент GL10.GL_FLOAT указывает, что буфере заполнен числами с плавающей точкой. Третий аргумент 0 - сдвиг в байтах между цветами одной вершины и цветами следующей вершины. Четвертый аргумент colorBuffer - это наш буфер цветов. Теперь цвета вершин переданы в OpenGL. Когда мы вызовем команду рисования glDrawArrays на экране появится треугольник, закрашенный цветами вершин. При этом, если включен режим сглаживания командой glShadeModel(GL10.GL_SMOOTH), цвета в треугольнике будут плавно изменяться при переходе от одной вершины к другой (эффект радуги).