SimpleRenderer — это высокопроизводительный программный рендерер на C++, написанный с нуля. Проект демонстрирует реализацию полного графического конвейера без использования GPU, полагаясь исключительно на вычисления центрального процессора.
- Tangent Space Normal Mapping: Реализация попиксельного рельефа с использованием матриц TBN (Tangent, Bitangent, Normal) для корректного преобразования векторов в мировое пространство.
- SSAO (Screen Space Ambient Occlusion): Динамическое затенение в экранном пространстве. Использует полусферное ядро из 128 выборок и буфер глубины для расчета окклюзии. Визуализация SSAO Buffer:
- Toon/Cel Shading: Стилизованный рендеринг с квантованием освещенности и пост-процессингом на основе фильтра Собеля для детекции границ и создания контуров.
- Barycentric Rasterizer: Оптимизированный растеризатор, использующий барицентрические координаты для интерполяции атрибутов вершин. Распараллелен с помощью OpenMP для повышения производительности. Z-Buffer (Визуализация глубины):
- AO & Shadow Mapping: Поддержка Brute-force AO (1000 лучей на пиксель) в качестве эталона для сравнения с SSAO. AO Brute-force:
- CLI Interface: Гибкая настройка сцены через аргументы командной строки: загрузка нескольких моделей, настройка цветов, освещения и выбор шейдера.
- TBN Matrix: Реализована генерация касательного пространства для каждой вершины, что позволяет использовать карты нормалей в пространстве касательных, обеспечивая корректное освещение при любой ориентации модели в мировых координатах.
- SSAO Logic: Используется полусферическое ядро из 128 выборок с весовым затуханием и случайным поворотом вектора шума для устранения эффекта «полос».
- Post-Processing Pipeline: После основного прохода рендеринга применяется фильтр Собеля по буферу глубины для создания стилизованной обводки и выполняется размытие для сглаживания теней SSAO.
| Флаг | Описание | Значение по умолчанию |
|---|---|---|
-m |
Пути к одной или нескольким моделям (.obj) | obj/diablo3_pose.obj |
-shader |
Тип шейдера: toon, gouraud, phong, tangentspace, wireframe, solid, random |
toon |
-ao |
Метод затенения: ssao, bruteforce или none |
ssao |
-c |
Список цветов для моделей (например, gold, red, white) |
orange |
-l |
Вектор направления света x y z |
-1.5 0.5 1.5 |
-w / -s |
Ширина и высота выходного изображения | 2048x2048 |
- Компилятор с поддержкой C++17 (MSVC, GCC или Clang).
- CMake (версия 3.10+).
- OpenMP (рекомендуется для распараллеливания расчетов SSAO и растеризации).
# Генерация файлов сборки
cmake -Bbuild
# Компиляция (на Linux/macOS добавьте -j для ускорения)
cmake --build build --config Release
Программа поддерживает гибкую настройку через флаги.
Windows (PowerShell):
# Запуск с SSAO и Tangent Space Normal Mapping
./build/Release/tinyrenderer.exe -m obj/diablo3_pose/diablo3_pose.obj -shader tangentspace -ao ssao -c gold
Linux:
./build/tinyrenderer -m obj/model.obj -shader toon -ao none -l -1 1 1