Проект собирается с помощью системы сборки Gradle. Для того чтобы открыть проект с помощью Intellij Idea нужно: Нажать "Open" -> выбрать файл "build.gradle" в корне проекта -> Нажать "Trust" -> дождаться инициализации Gradle (может занять некоторое время)
Чтобы создать собственное пустое приложение в LibGDX - обратитесь к официальной документации библиотек (https://libgdx.com/dev/)
Проект состоит из 3 Java-модулей:
- lwjgl3 - точка входа в проект. Управляет сборкой и запуском проекта под персональные компьютеры. LibGDX поддерживает различные платформы, например, Android или Web. Для каждой платформы должен быть отдельный модуль, управляющий сборкой и запуском приложения
- core - содержит весь игровой код проект. Этот модуль не знает ни про какие специфики работы в разных платформах. Вся работа будет проходить в этом модуле
- assets - все ресурсы вашей игры. Тут могут содержаться различные картинки, конфигурационные файлы и прочее
LibGDX - это довольно минималистичная обёртка над библиотекой LWJGL, предоставляющей возможность взаимодействовать с драйвером OpenGL из Java-приложения. LibGDX является скорее библиотекой, предоставляющая некоторые основные инструменты разработки, давая возможность разработчикам самим сделать основную архитектуру игры и её рендеринг. LibGDX также является кроссплатформенной библиотекой.
LibGDX самостоятельно реализует главный игровой цикл, предоставляя разработчику возможность реагировать на различные события этого цикла. Для реакции на события игрового цикла необходимо зарегистрировать класс, реализующий интерфейс ApplicationListener. Этот класс позволяет вам описать код при старте проекта, обновлять и отрисовывать внутреннее состояние приложения, освобождать ресурсы при выходе из приложения и многое другое.
LibGDX также предоставляет несколько подсистем, упрощающих взаимодействие с OpenGL. Доступны они через статические переменные в классе Gdx.
Видеокарты представляют собой специальные процессоры с огромным количеством отдельных ядер. Ядра видеокарты очень плохо справляются с классической ветвистой логикой программы, но отлично справляется с многочисленным параллельными операциями над данными. Это делает их идеальным инструментом для отображения геометрических фигур в пространство экрана, разбивкой их на отдельные пиксели и вычисления цвета каждого пикселя фигуры.
OpenGL является стандартным драйвером работы с видеокартой. Помимо OpenGL существуют и другие драйверы, например DirectX (для Windows) или Vulcan. OpenGL предоставляет пользователю возможность многопоточной обработки графических примитивов в видеокарте и их последующий вывод на экран. Взаимодействие с OpenGL осуществляется по принципу машины состояний. На каждом этапе пользователь подготавливает данные состояния OpenGL и производит переход к другому состоянию.
Для отрисовки OpenGL оперирует множеством полигонов, описываемых 3-х мерными координатами вершин и дополнительными данными для них. Пользователь может загружать в OpenGL пакеты примитивов, чтобы не передавать их по одному. Для каждого пакета примитива можно подгрузить дополнительные данные, например, текстуру.
OpenGL осуществляет работу по отрисовки кадра следующими способами:
- Программа передаёт в OpenGL массив данных о вершинах каждого полигона. В основном на этом этапе каждой вершине назначается её трёхмерные координаты и цвет
- Далее в OpenGL отправляется массив, описывающий принадлежность каждой вершины к конкретным полигонам
- Для каждой вершины отрабатывает вершинный шейдер (см. раздел "Шейдеры")
- Далее выполняется тесселяция - процес дробление полигонов на более мелкие полигоны
- Для каждого полигона отрабатывает геометрический шейдер
- Сборка полигонов из предыдущих этапов для подготовки их к растеризации - процессу превращения геометрических фигур в набор пикселей на экране
- Обрабатывание и отсечение. На этом этапе происходит удаление некоторых полигонов или частей полигонов, которые не могут быть увидены пользователем на экране. Необходимо для оптимизации растеризации.
- Растеризация. На этом этапе все геометрические фигуры с помощью интерполяции разбиваются на множество пикселей на экране монитора
- Для каждого пикселя каждого полигона параллельно на огромном количестве ядер видеокарты выполняется фрагментный шейдер
- Происходит смешивание цветов у пикселей различных полигонов, которые находятся на одном и том же месте экрана. Такое может произойти, если мы имеем полностью непрозрачный полигон, который перекрывается полупрозрачным полигоном.
- Затем вся получившаяся картинка передаётся в буфер кадра, который затем будет выведен на экран
Шейдеры - это программы, которые запускаются на видеокарте. OpenGL позволяет прямо во время работы программы скомпилировать шейдеры и загрузить их в видеопамять. Шейдеры назначаются каждому геометрическому объекту, который будет отрисован на экране. Шейдерные программы состоят из нескольких отдельных программ разных видов:
- Вершинный шейдер - программа, которая отрабатывает для каждой вершины геометрического объекта. Вершинный шейдер позволяет изменить расположение или другие данные вершины. Например, часто в играх колыхания травы на ветру выполняется вершинным шейдером, который растягивает и смещает текстуру травы.
- Геометрический шейдер - применяется для изменения геометрии полигонов. Описывается не часто, в основном для каких-то необычных задач над полигонами.
- Фрагментный шейдер - программа, выполняемая для каждого пикселя одного полигона. Определяет преимущественно цвет каждого пикселя. Может получать данные из вершинного шейдера. Данные получаются путём усреднения значений данных из каждой вершины полигона.