Skip to content

Hummel009/Computer-Graphics-Algorithms

Repository files navigation

Code Smells Maintainability Rating Security Rating Bugs Vulnerabilities Duplicated Lines (%) Reliability Rating Quality Gate Status Technical Debt Lines of Code

Мои лабораторные работы для BSUIR/БГУИР (белорусский государственный университет информатики и радиоэлектроники).

Предмет - AKG/АКГ (алгоритмы компьютерной графики).

Условия

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

Суть всех лабораторных: объект, с которым можно взаимодействовать: вращать его при помощи мыши.

Лабораторная работа 1

  • Разработать парсер файлов формата .obj;
  • Реализовать матричные преобразования координат из пространства модели в мировое пространство;
  • Реализовать матричное преобразование координат из мирового пространства в пространство наблюдателя;
  • Реализовать матричное преобразование координат из пространства наблюдателя в пространство проекции;
  • Реализовать матричное преобразование координат из пространства проекции в пространство окна просмотра;
  • Отрендерить 3D модель в проволочном виде (границы полигонов).

Рисование отдельных линий реализовано по алгоритму Брезенхема.

В репозитории находится два модуля с двумя разными реализациями лабораторной работы: на Kotlin JVM и Kotlin Native. Второй выдаёт больше FPS.

Лабораторная работа 2

  • Реализовать алгоритм растеризации треугольников;
  • Реализовать отбраковку невидимых и задних поверхностей трехмерных объектов;
  • Реализовать плоское затенение и модель освещения Ламберта (diffuse);
  • Отрендерить 3D модель с поверхностями и освещением.

В репозитории находится два модуля с двумя разными реализациями лабораторной работы: на Kotlin JVM и Kotlin Native. Второй выдаёт больше FPS.

Лабораторная работа 3

  • Реализовать модель освещения Фонга (ambient + diffuse + specular);
  • Отрендерить 3D модель с поверхностями и освещением.

В репозитории находится два модуля с двумя разными реализациями лабораторной работы: на Kotlin JVM и Kotlin Native. Второй выдаёт больше FPS.

Лабораторная работа 4

  • Реализовать парсер карт mrao, normal, diffuse;
  • Применить данные из карт в освещении, чтобы сделать его цветным;
  • Отрендерить 3D модель с поверхностями и освещением в цвете.

Разработку на Kotlin Native мы не потянули из-за того, что не получилось прочитать битмапы. Поэтому в репозитории находится только модуль на Kotlin JVM.

Лабораторная работа 5

  • Перенести графику на GPU.

Была использована сторонняя библиотека, LWJGL. Она используется, например, в игре Minecraft — вся её графика написана при помощи этой библиотеки. На GPU были перенесены все четыре лабораторные работы (их варианты JVM, так как разработка Native была слишком трудоёмка, хоть и выдавала более хороший FPS). Лабораторные работы 1-2 были перенесены на GPU основательно, там были заменены целые функции (рисование линии и рисование полигона). Лабораторные работы 3-4 были перенесены на более низком уровне — алгоритмы остались свои, была заменена лишь функция рисования пикселя.

Чем проще лаба, чем меньше вычислений и чем примитивнее модель, тем более большой FPS выдаёт GPU.