Мои лабораторные работы для BSUIR/БГУИР (белорусский государственный университет информатики и радиоэлектроники).
Предмет - AKG/АКГ (алгоритмы компьютерной графики).
Все работы являются программами на тему компьютерной графики. Каждая следующая работа является развитием предыдущей. Ретроспективно работы были улучшены и пофикшены, но даже в неисправленном виде были успешно сданы.
Суть всех лабораторных: объект, с которым можно взаимодействовать: вращать его при помощи мыши.
- Разработать парсер файлов формата .obj;
- Реализовать матричные преобразования координат из пространства модели в мировое пространство;
- Реализовать матричное преобразование координат из мирового пространства в пространство наблюдателя;
- Реализовать матричное преобразование координат из пространства наблюдателя в пространство проекции;
- Реализовать матричное преобразование координат из пространства проекции в пространство окна просмотра;
- Отрендерить 3D модель в проволочном виде (границы полигонов).
Рисование отдельных линий реализовано по алгоритму Брезенхема.
В репозитории находится два модуля с двумя разными реализациями лабораторной работы: на Kotlin JVM и Kotlin Native. Второй выдаёт больше FPS.
- Реализовать алгоритм растеризации треугольников;
- Реализовать отбраковку невидимых и задних поверхностей трехмерных объектов;
- Реализовать плоское затенение и модель освещения Ламберта (diffuse);
- Отрендерить 3D модель с поверхностями и освещением.
В репозитории находится два модуля с двумя разными реализациями лабораторной работы: на Kotlin JVM и Kotlin Native. Второй выдаёт больше FPS.
- Реализовать модель освещения Фонга (ambient + diffuse + specular);
- Отрендерить 3D модель с поверхностями и освещением.
В репозитории находится два модуля с двумя разными реализациями лабораторной работы: на Kotlin JVM и Kotlin Native. Второй выдаёт больше FPS.
- Реализовать парсер карт mrao, normal, diffuse;
- Применить данные из карт в освещении, чтобы сделать его цветным;
- Отрендерить 3D модель с поверхностями и освещением в цвете.
Разработку на Kotlin Native мы не потянули из-за того, что не получилось прочитать битмапы. Поэтому в репозитории находится только модуль на Kotlin JVM.
- Перенести графику на GPU.
Была использована сторонняя библиотека, LWJGL. Она используется, например, в игре Minecraft — вся её графика написана при помощи этой библиотеки. На GPU были перенесены все четыре лабораторные работы (их варианты JVM, так как разработка Native была слишком трудоёмка, хоть и выдавала более хороший FPS). Лабораторные работы 1-2 были перенесены на GPU основательно, там были заменены целые функции (рисование линии и рисование полигона). Лабораторные работы 3-4 были перенесены на более низком уровне — алгоритмы остались свои, была заменена лишь функция рисования пикселя.
Чем проще лаба, чем меньше вычислений и чем примитивнее модель, тем более большой FPS выдаёт GPU.