Java + OpenGL — так ли страшно


Содержание

Использование OpenGL в Java

Принципы реализации OpenGL в Java

В настоящее время Java очень широко распространена и все больше и больше различных технологий переносятся на этот язык. Не исключением является и OpenGL. OpenGL дополняет Java таким образом, что перспективные технологии 3D графики становятся реальностью при написании апплетов для WEB с помощью Java. OpenGL реализован в Java посредством дополнительных расширений и библиотек. Существует несколько видов этих библиотек, все они выпускаются различными небольшими компаниями. Коммерческие библиотеки я рассматривать не буду, а рассмотрю самую распространенную и самое главное бесплатную (GNU лицензия) библиотеку GL4Java (Ее можно взять по адресу http://www.jausoft.com). Кроме того, эта библиотека имеет меньше всего недостатков и вдобавок к этому существует практически под все операционные системы. Поэтому далее мы будем рассматривать именно эту библиотеку.

Хоть Java и OpenGL являются мультиплатформенными, GL4Java устанавливается на различные платформы по разному. GL4Java является связующим элементом между Java и конкретной реализацией OpenGL на данной платформе. Например в Windows OpenGL реализован через динамическую библиотеку opengl32.dll и GL4Java позволяет обращаться из Java апплетов к функциям этой библиотеки. Конечно для каждой конкретной операционной системы существуют библиотеки GL4Java, откомпилированные именно под эту операционную систему.

Но существует небольшая хитрость. Так как в Java апплетах запрещено использование локальных файлов пользователя, то возникает вопрос, каким образом программа на Java обращается к динамическим библиотекам Windows? Сделано это таким образом, что в GL4Java имеются специальные библиотеки (называемые wrapper библиотеками, т.е. находящимися между Java и OpenGL библиотеками), к которым возможно обращение из Java апплетов. Таким образом через эти библиотеки происходит уже непосредственное обращение к библиотекам OpenGL. Еще одной особенностью такой реализации является то, что скорость работы Java апплета сравнима со скоростью стандартных OpenGL программ, написанных например на C/C++, так как OpenGL команды обрабатываются не в интерпретаторе Java, а выполняются системой, обращаясь к локальным библиотекам.

2. Построение Java апплета с использованием OpenGL

Построение апплета мало чем отличается от стандартного. Рассмотрим на примере, приведенном ниже.

Класс MainApp — это основной класс апплета, наследуемый от класса Applet. Класс MainGL наследуется от специального класса GLAnimCanvas, который определен в библиотеке GL4Java. От этого класса должны наследоваться классы, которые отвечают за рисование на поверхности OpenGL апплета. GLAnimCanvas унаследован от класса GLCanvas и является его расширением, добавляя поддержку потоков для анимации. В основном большинство OpenGL апплетов используют именно этот класс.

Рассмотрим теперь, какие основные методы (которые необходимы для работы OpenGL программы) можно переопределять в своем классе и для чего они нужны.

public void preInit() — Вызывается до того как создается OpenGL контекст. Обычно используется для установки параметров OpenGL, например использование двойной буфферизации.

public void init() — Вызывается после того, как создается OpenGL контекст. Тут можно вызывать команды установки проекции OpenGL и другие команды по инициализации.

public void display() — Это метод, который вызывается для того, чтобы перерисовать содержимое на поверхности для рисования. В данном примере он вызывается автоматически, но его можно вызывать и самостоятельно. В этом методе вызываются команды OpenGL, отвечающие за рисование.

Это в принципе и все, что нужно знать. Подробную информацию, а также дополнительные методы смотрите в документации по GL4Java.

Процесс написания OpenGL программы на Java, мало чем отличается от программы на C/C++. Единственное, что хочу отметить, это то, что перед OpenGL командой надо ставить «gl.» (gl с точкой), соответственно перед командой из GLU библиотеки «glu.» и т.д.

Далее я привожу пример (скелет) апплета на Java, использующего OpenGL.

Java + OpenGL. Так ли страшно? [GeekBrains]

Начни карьеру с бесплатного курса «Основы программирования» https://goo.gl/jTP4nP

Жил был OpenGL 1.1 и все было хорошо — любой начинающий мог легко погрузиться в пучины 3D графики. Однако, шли годы, технологии развивались — появились шейдеры. Наконец, начиная с версии 3.3, было решено отказаться от множества старых концепций, делающих OpenGL простым для изучения.


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

Подписывайся на наш канал и смотри новые видео первым: https://www.youtube.com/progliveru

Проходи бесплатные курсы: https://goo.gl/4gG8TL
Выбери профессию: https://goo.gl/WSdYSE
Смотри вебинары: https://goo.gl/bBVKcb
Читай статьи: https://goo.gl/XfJNqc
Проверяй знания: https://goo.gl/gqKSsw

ВКонтакте https://vk.com/geekbrainsru
Facebook https://www.facebook.com/geekbrains.ru
Одноклассники https://ok.ru/geekbrains
Telegram https://t.me/geekbrains_ru
Instagram https://www.instagram.com/geekbrains.ru/

#вебпрограммирование #шейдеры #opengl #geekbrains #программирование #курсыпрограммирования

Цукерберг рекомендует:  Есть работа после курсов - Трудоустройство в регионе

Java + OpenGL. Так ли страшно? [GeekBrains]

Начни карьеру с бесплатного курса «Основы программирования» goo.gl/jTP4nP
Java + OpenGL.
Жил был OpenGL 1.1 и все было хорошо — любой начинающий мог легко погрузиться в пучины 3D графики. Однако, шли годы, технологии развивались — появились шейдеры. Наконец, начиная с версии 3.3, было решено отказаться от множества старых концепций, делающих OpenGL простым для изучения.
Теперь юному подавану для рисования простейшего куба вдруг необходимо что-то знать про линейную алгебру, матрицы и шейдеры. Большинство не выдерживает тяжкой ноши и сдается. Данный вебинар поможет вам пройти этот переломный момент.
Подписывайся на наш канал и смотри новые видео первым: frreporter.com/title-progliveru
Проходи бесплатные курсы: goo.gl/4gG8TL
Выбери профессию: goo.gl/WSdYSE
Смотри вебинары: goo.gl/bBVKcb
Читай статьи: goo.gl/XfJNqc
Проверяй знания: goo.gl/gqKSsw
ВКонтакте vk.com/geekbrainsru
Facebook facebook.com/geekbrains.ru
Одноклассники ok.ru/geekbrains
Telegram t.me/geekbrains_ru
Instagram instagram.com/geekbrains.ru/
#вебпрограммирование #шейдеры #opengl #geekbrains #программирование #курсыпрограммирования

Slava S Il y a an

Gosha Svetlov Il y a an

э-э-а-э-а, сколько можно? о каком платном обучении на geekbrains может вообще идти речь если там приподают такие уникумы?

Dark Hunter Il y a an

в С++ вроде меньше геммороя, но я и там не понял как OpenGL вставлять =)

Evgeniy Palguev Il y a an

в следующий раз лицо можно убрать, смысловой нагрузки не несёт, яркое пятно окна только мешает

Java + OpenGL. Так ли страшно? [GeekBrains]

Смотреть видео Java + OpenGL. Так ли страшно? [GeekBrains] на Smotri.City бесплатно

106 | 19
Образовательный портал GeekBrains | 3 год.


Начни карьеру с бесплатного курса «Основы программирования» https://goo.gl/jTP4nP

Жил был OpenGL 1.1 и все было хорошо — любой начинающий мог легко погрузиться в пучины 3D графики. Однако, шли годы, технологии развивались — появились шейдеры. Наконец, начиная с версии 3.3, было решено отказаться от множества старых концепций, делающих OpenGL простым для изучения.

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

Подписывайся на наш канал и смотри новые видео первым: https://www.youtube.com/progliveru

Проходи бесплатные курсы: https://goo.gl/4gG8TL
Выбери профессию: https://goo.gl/WSdYSE
Смотри вебинары: https://goo.gl/bBVKcb
Читай статьи: https://goo.gl/XfJNqc
Проверяй знания: https://goo.gl/gqKSsw

ВКонтакте https://vk.com/geekbrainsru
Facebook https://www.facebook.com/geekbrains.ru
Одноклассники https://ok.ru/geekbrains
Telegram https://t.me/geekbrains_ru
Instagram https://www.instagram.com/geekbrains.ru/

#вебпрограммирование #шейдеры #opengl #geekbrains #программирование #курсыпрограммирования

java opengl %d1%82%d0%b0%d0%ba %d0%bb%d0%b8 %d1%81%d1%82%d1%80%d0%b0%d1%88%d0%bd%d0%be geekbrains

Comment : Java opengl %d1%82%d0%b0%d0%ba %d0%bb%d0%b8 %d1%81%d1%82%d1%80%d0%b0%d1%88%d0%bd%d0%be geekbrains

2020 © OnlineMakeMoney.work — Author Tuong Nguyen

All videos under the management of youtube OnlineMakeMoney.work is not responsible for content.

Page rendered in 0.2521 seconds.

Это видео недоступно.

Очередь просмотра

Очередь

  • Удалить все
  • Отключить

YouTube Premium

Java + OpenGL. Так ли страшно? [GeekBrains]

Хотите сохраните это видео?

  • Пожаловаться

Пожаловаться на видео?

Выполните вход, чтобы сообщить о неприемлемом контенте.

Понравилось?

Не понравилось?

Начни карьеру с бесплатного курса «Основы программирования» https://goo.gl/jTP4nP

Жил был OpenGL 1.1 и все было хорошо — любой начинающий мог легко погрузиться в пучины 3D графики. Однако, шли годы, технологии развивались — появились шейдеры. Наконец, начиная с версии 3.3, было решено отказаться от множества старых концепций, делающих OpenGL простым для изучения.

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

Java + OpenGL. Так ли страшно? [GeekBrains]

Начни карьеру с бесплатного курса «Основы программирования» https://goo.gl/jTP4nP

Жил был OpenGL 1.1 и все было хорошо — любой начинающий мог легко погрузиться в пучины 3D графики. Однако, шли годы, технологии развивались — появились шейдеры. Наконец, начиная с версии 3.3, было решено отказаться от множества старых концепций, делающих OpenGL простым для изучения.


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

Подписывайся на наш канал и смотри новые видео первым: https://www.youtube.com/progliveru

Проходи бесплатные курсы: https://goo.gl/4gG8TL
Выбери профессию: https://goo.gl/WSdYSE
Смотри вебинары: https://goo.gl/bBVKcb
Читай статьи: https://goo.gl/XfJNqc
Проверяй знания: https://goo.gl/gqKSsw

ВКонтакте https://vk.com/geekbrainsru
Facebook fb.com/geekbrains.ru
Одноклассники https://ok.ru/geekbrains
Telegram https://t.me/geekbrains_ru
Instagram https://www.instagram.com/geekbrains.ru/

#вебпрограммирование #шейдеры #opengl #geekbrains #программирование #курсыпрограммирования

Java + OpenGL. Так ли страшно? [GeekBrains]

Начни карьеру с бесплатного курса «Основы программирования» https://goo.gl/jTP4nP Java + OpenGL. Жил был OpenGL 1.1 и все было хорошо — любой начинающий мог легко погрузиться в пучины 3D графики. Однако, шли годы, технологии развивались — появились шейдеры. Наконец, начиная с версии 3.3, было решено отказаться от множества старых концепций, делающих OpenGL простым для изучения. Теперь юному подавану для рисования простейшего куба вдруг необходимо что-то знать про линейную алгебру, матрицы и шейдеры. Большинство не выдерживает тяжкой ноши и сдается. Данный вебинар поможет вам пройти этот переломный момент. Подписывайся на наш канал и смотри новые видео первым: https://www.youtube.com/progliveru Проходи бесплатные курсы: https://goo.gl/4gG8TL Выбери профессию: https://goo.gl/WSdYSE Смотри вебинары: https://goo.gl/bBVKcb Читай статьи: https://goo.gl/XfJNqc Проверяй знания: https://goo.gl/gqKSsw ВКонтакте https://vk.com/geekbrainsru Facebook https://www.facebook.com/geekbrains.ru Одноклассники https://ok.ru/geekbrains Telegram https://t.me/geekbrains_ru Instagram https://www.instagram.com/geekbrains.ru/ #вебпрограммирование #шейдеры #opengl #geekbrains #программирование #курсыпрограммирования

16 бит тому назад — Как появился OpenGL

История OpenGL http://16-bits.ru Наша группа ВКонтакте, которая обновляется каждый день: http://vk.com/ga

Отзывы GeekBrains JavaRush Специалист Luxoft и другие

Отзывы GeekBrains JavaRush Специалист Luxoft и другие http://job4j.ru/ — Обучение и трудоустройство Java-прог

Coding Minecraft in One Week — C++/OpenGL Programming Challenge

Hello! In this video, I attempt to create a simple voxel game/ Minecraft clone in a single week. It doesn’t have the best performance or the most features; but

Java 3D Game Development 78: Shadows!

3D OpenGL Game development log videos about my indie Java RPG game. Implemented shadow mapping this week! Here are the main resources that I used: http://htt

Что могут хакеры? В школе такому точно не научат. Профессионалы..

Я ВКонтакте: https://vk.com/bishaevasily На что способны хакеры? Отключать свет в домах, перехватыва


First comparison of Vulkan API vs OpenGL ES API on ARM

Vulkan API supports multithreading, which is particularly important for mobile platforms. Multithreading enables the system to balance the workload across multi

LWJGL 3 — JetBrains Intellij > DISCLAIMER: I have no clue if this works on Windows or not. I don’t have a realistic way of checking. Apologies! A (hopefully) helpful video on how to set up L

Создание 3d игр на C++: Minecraft

Скачать код и exe: https://drive.google.com/uc?export=download& >

Какие требования к разработчику уровня junior?

Руководитель проекта Labitex (IT-биржи труда) Дмитрий Хорошилов в интервью с сертифицирован

Программирование на Java: создание игры Змейка. Часть 1.

Первая часть туториала по созданию игры Змейка на Java. код для 1 части — https://github.com/irinamore/snak

I wrote an OpenGL first-person demo for DOS (256 colors, dithering, OSMesa)

In this tool-assisted education video I create a simple FPS style walking and jumping scene for OpenGL, with DJGPP, in DOS. In a 256 colors 320×200 VGA mode. Th

Настройка OpenGL на Visual Studio 2020. Установка OpenGL. Подключения OpenGL, GLUT

ресурс: https://www.opengl.org/resources/libraries/glut/ Поблагодарить автора (по возможности): Кошелек Webmoney: �

Speed Coding: Pong in C++ AND Java | Which is Better?

FOLLOW ME ON TWITTER FOR CODING TWEETS: https://twitter.com/CodingBash [«Show More» for full description] ◘▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

О том как создается графика в браузере. Уроки по WebGL. #1

Как создать 3D в браузере? Как добавить на свой сайт простой трехмерный куб? Что делать е

My first 3D game using OpenGL + Glut (Extended)


Downloads for the executables and the source code in the description: This is a demo for a single player skill game. Goals: — Collect the 5 keys one by one. —

Геймдев на Java 001 — Создаем проект и подключаем LWJGL

Как создать проект и подключить LWJGL в средах Eclipse и NetBeans. И не забываем установить послед

Creating Minecraft in C++/ OpenGL — Part One

I started this project in early October 2020, and finally I have enough to show of it for a video. I made for the sake of learning and for fun. I had to learn

Java 3D Game Development 73: Harbour Town

3D OpenGL Game development log videos about my indie Java RPG game. Take a tour of the harbour town! Facebook: https://www.facebook.com/thinmatrix Tumblr: htt

Java разработка игры с нуля — Введение и метод main — Часть 1

Серия о том как начинающий кодер Java делает игру с нуля. Используется только базовая гра�

OpenGL Render Engine Showcase

Developed April 2020 — August 2020 1080p full screen is the healthy choice Potential future applications include a fluid/cloth simulation or a planetary gravi

Java + OpenGL. Так ли страшно? [GeekBrains]

Начни карьеру с бесплатного курса «Основы программирования» https://goo.gl/jTP4nP

Жил был OpenGL 1.1 и все было хорошо — любой начинающий мог легко погрузиться в пучины 3D графики. Однако, шли годы, технологии развивались — появились шейдеры. Наконец, начиная с версии 3.3, было решено отказаться от множества старых концепций, делающих OpenGL простым для изучения.

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

Подписывайся на наш канал и смотри новые видео первым: https://www.youtube.com/progliveru

Проходи бесплатные курсы: https://goo.gl/4gG8TL
Выбери профессию: https://goo.gl/WSdYSE
Смотри вебинары: https://goo.gl/bBVKcb
Читай статьи: https://goo.gl/XfJNqc
Проверяй знания: https://goo.gl/gqKSsw


ВКонтакте https://vk.com/geekbrainsru
Facebook https://www.facebook.com/geekbrains.ru
Одноклассники https://ok.ru/geekbrains
Telegram https://t.me/geekbrains_ru
Instagram https://www.instagram.com/geekbrains.ru/

#вебпрограммирование #шейдеры #opengl #geekbrains #программирование #курсыпрограммирования

Изучаем OpenGL ES2 для Android Урок №3. Освещение

Перед тем как начать
Если вы новичок в OpenGL ES, рекомендую сначала изучить уроки №1 и №2, так как данный урок опирается на знания предыдущих уроков.
Основы кода, используемого в этой статье, взяты отсюда:
1. http://andmonahov.blogspot.com/2012/10/opengl-es-20.html
2. http://www.learnopengles.com/android-lesson-two-ambient-and-diffuse-lighting/
В результате мы получим такую картинку на экране устройства или эмулятора.

Немного о свете и видах источников света
Свет может рассматриваться либо как электромагнитная волна определенной частоты, либо как поток фотонов — частиц, обладающих определённой энергией. В зависимости от того, какие фотоны упали на определенные места сетчатки глаза, наш мозг создает зрительные ощущения.
Ощущения цвета, зависят от энергии фотона или частоты электромагнитного излучения. В качестве коротковолновой границы спектрального диапазона, занимаемого светом, принят участок с длинами волн в вакууме 380—400 нм (фиолетовый), а в качестве длинноволновой границы — участок 760—780 нм (красный).

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

Фоновое освещение (ambient lighting)
Когда объекты освещены одинаково со всех сторон, мы говорим о фоновом освещении. В природе такое обычно бывает в пасмурный день. Если мы находимся в помещении, то такое освещение возникает при многократном отражении света от разных объектов или при наличии множества источников света распределенных особым образом, в результате чего наша модель будет освещена со всех сторон. На фото слева вы видите картинку, где смикшировано направленное и фоновое освещение, а справа – только фоновое. При расчете фонового освещения не учитываются ни нормали поверхностей (под каким углом луч падает на поверхность), ни текущее положение камеры.

Как описать фоновое освещение программно?
Пусть наш объект является красным, а наш фоновый свет будет тускло-белый. Предположим, что мы сохраняем цвет, как массив из трех цветов: красного, зеленого и синего, используя цветовую модель RGB. Тогда, нам нужно перемножить весовые коэффициенты цветов на некую константу освещенности.
final color = <1, 0, 0>* <0.1, 0.1, 0.1>= <0.1, 0.0, 0.0>
Теперь окончательный цвет объекта станет тускло-красным, что соответствует тому, что мы увидим в реальной жизни, если осветим красный объект тусклым белым светом.

Рассеянное освещение
Рассеянное освещение (diffuse lighting) — свет от источника рассеивается после попадания в заданную точку. В зависимости от угла, под которым падает свет, освещение становится сильнее или слабее. Здесь учитываются нормали к поверхности, но не положение камеры;

Представим себе, что луч света падает под углом 45 градусов (угол между лучом и нормалью к поверхности) на горизонтальную поверхность. В результате диффузного (рассеянного) отражения световая энергия равномерно отразится во все стороны, поэтому все три камеры снимут поверхность одинаковой яркости. Понятно, что если свет будет падать под углом 0 градусов (перпендикулярно к поверхности), поверхность будет освещена лучше всего. А если луч света будет падать под углом близким к 90 градусам, то лучи будут скользить по поверхности и не осветят её.

Программное моделирование диффузного отражения
Чтобы смоделировать диффузное отражение, применяют коэффициент Ламберта (lambert factor).
light vector = light position — object position
cosine = dot product(object normal, normalize(light vector))
lambert factor = max(cosine, 0)

Поясним эти три строчки кода.
Сначала вычисляют вектор света путем вычитания позиции объекта из положения источника света.
light vector = light position — object position

Тогда мы сможем рассчитать косинус угла между вектором света и нормалью, найдя скалярное произведение между нормалью к поверхности и нормированного вектора света. Нормировать вектор света – значит изменить его длину так, чтобы она равнялась единице, но направление вектора при этом остается неизменным. Модуль нормали к поверхности у нас уже равен единице. Определив скалярное произведение двух нормированных векторов, найдем косинус угла между ними.
cosine = dot product(object normal, normalize(light vector))

Поскольку скалярное произведение может иметь диапазон от -1 до 1, мы должны ограничить его в диапазоне от 0 до 1. Функция max(х, у) дает «х», если «х» больше «у» и наоборот.
lambert factor = max(cosine, 0)

Чтобы было понятно, рассмотрим на примере.

Пусть наш источник света находится в т.S (0,10,10), а мы хотим вычислить освещенность горизонтальной поверхности (это может быть единственный пиксель), у которого нормаль смотрит вертикально вверх (0, 1, 0). Тогда вектор OS (light vector) и вектор нормали (object normal)
light vector = <0, 10, 10>— <0, 0, 0>= <0, 10, 10>
object normal = <0, 1, 0>

Найдем длину вектора OS
light vector length = square root(0*0 + 10*10 + 10*10) = square root(200) = 14.14

Нормализуем его, т.е. сделаем так, что его длина станет равной единице.
normalized light vector = <0, 10/14.14, 10/14.14>= <0, 0.707, 0.707>

Затем мы вычисляем скалярное произведение:
dot product(<0, 1, 0>, <0, 0.707, 0.707>) = (0 * 0) + (1 * 0.707) + (0 * 0.707) = 0 + 0.707 + 0 = 0.707

Кто подзабыл математику, напомню, что скалярное произведение двух векторов равно произведению их модулей, помноженному на косинус угла между ними. Если модули у нас равны по единице, то скалярное произведение равно косинусу.
Есть маленькая проблема, которая заключается в том, что в принципе косинус может принимать и отрицательные значения, если угол альфа от 90 до 180 градусов. Поэтому мы ограничиваем диапазон значений коэффициента Ламберта от 0 до 1.
lambert factor = max(0.707, 0) = 0.707

Отраженное или бликовое освещение
Отраженное освещение (specular lighting) — это свет от источника, отраженный после попадания в заданную точку. Отраженный свет виден только, если он попадает в камеру. Поэтому здесь учитываются как нормали, так и положение камеры.

Программная реализация блика
При расчете диффузного освещения был определен вектор единичной длины, проходящий из освещаемой точки к источнику света normalized light vector. Чтобы определить вектор падающего света от источника света к точке на поверхности, нужно просто поменять знак на минус.

Для вычисления отраженного вектора (направление OS1) в GLSL существует специальная функция reflect:
reflectvector = reflect(- normalized light vector, object normal);

Координаты камеры передаём во фрагментный шейдер, как униформу u_camera:
uniform vec3 u_camera;

Теперь вычислим вектор OК, указывающий из точки освещения на камеру и нормализуем его:
lookvector = normalize(u_camera — object position);

Далее нам нужно вычислить косинус угла бета между отраженным вектором OS1 и направлением на камеру ОК. Раньше мы уже показали, что косинус угла это скалярное произведение двух единичных векторов: dot(lookvector,reflectvector). Чем меньше значение угла бета, тем ярче будет блик.
Также, как для lambert factor, отсекаем отрицательные значения скалярного произведения при помощи функции max:
max(dot(lookvector,reflectvector),0.0)

Размер самого блика можно регулировать при помощи параметра блеска, для этого вычисленное значение скалярного произведения нужно возвести в степень блеска. Для возведения в степень в GLSL предусмотрена функция pow. Обычно значение блеска берут несколько десятков единиц. При увеличении блеска размер блика уменьшается, но яркость его увеличивается. И наоборот, чем меньше блеск, тем больше размер блика, но яркость его становится меньше.

Пусть, для примера, блеск будет равен 30. Тогда возведем полученное скалярное произведение в степень 30:
pow( max(dot(lookvector,reflectvector),0.0), 30.0 )

Умножим полученное значение на коэффициент зеркального освещения k_specular и получим яркость зеркального освещения для данного пикселя:
float specular = k_specular * pow( max(dot(lookvector,reflectvector),0.0), 30.0 );

Суммарное освещение
Чтобы смоделировать освещение объекта в реальной жизни, нужно суммировать в определенных пропорциях разные типы освещения объекта. Например, чтобы получить цвет пикселя с учетом освещения нужно сложить фоновую, диффузную и зеркальную части освещения ambient + diffuse + specular и умножить на вектор цвета пикселя, полученного при интерполяции цветов вершин v_color.
gl_FragColor = (ambient+diffuse+specular)*v_color;

Если мы не хотим разукрашивать пиксели интерполированными цветами вершин достаточно определить вектор белого цвета:
vec4 one=vec4(1.0,1.0,1.0,1.0);

и умножить на него яркость освещения:
gl_FragColor = (ambient+diffuse+specular)*one;

Вы можете оценить, как меняется картинка, если взять сначала ambient = 1, diffuse = 0, specular = 0. Картинка в центре для случая ambient = 0, diffuse = 1, specular = 0, соответственно картинка справа для таких значений ambient = 0, diffuse = 0, specular = 1.

В этой строке происходит микширование освещенности и цвета.
gl_FragColor = mix(lightColor,v_color,0.6)

Посмотрите, как выглядит картинка (слева), если коэффициент микширования сделать 0, фактически мы видим распределение по яркости света. Если коэффициент сделать равным 1, то мы увидим чистые цвета.

Прежде чем перейти к исходникам, маленькие комментарии к ним.
1. Еще на прошлом уроке вы заметили, что в файле Манифеста появились такие строки

Теперь Google Play не будет показывать наше приложение на устройствах, которые не поддерживают OpenGL ES.
2. Во втором уроке мы рисовали треугольники, используя только метод GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
В этом уроке появился новый для нас метод GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
С помощью его удобней рисовать четырехугольники и сложные рельефы. Именно его мы применили для прорисовки моря, неба и лодки. Хороший урок по применению этого метода вы найдете здесь
http://www.learnopengles.com/tag/triangle-strips/

3. Наш кораблик нарисован немного выступающим по оси 0Z. Изменяя положение камеры, можно увидеть это смещение, работу матриц и изменение освещения поверхности. Слева камеру подняли на 5 единиц по 0У, справа – сместили на 4 единицы по 0Х.

Остальные пояснения вы найдете в самом коде.
Рекомендую сначала запустить проект, а потом играться и экспериментировать с разными коэффициентами.

Создаем проект
Создайте в Android Studio проект OpenGLESLighting
Главную активити назовите Opengles3Activity.
Создайте еще три java файла:
MyClassSurfaceView.java
MyClassRenderer.java
Shader.java

Скопируйте код и вставьте в файлы вместо того, что сгенерировалось автоматически.
Наслаждайтесь картинкой.:)
Если в статье закрались ошибки, рад буду их исправить и научиться у вас.
Всего хорошего!

Цукерберг рекомендует:  Html - Могу ли я на своем сайте использовать шрифты мака
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих