git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
cmake --build . -j &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj
Отрисованное изображение сохраняется framebuffer.tga
.
Вы можете открыть проект в Gitpod, бесплатной онлайн-среде разработки для GitHub:
При открытии редактор скомпилирует и запустит программу, а также откроет полученное изображение в предварительном просмотре редактора. Просто измените код в редакторе и перезапустите скрипт (используйте историю терминала), чтобы увидеть обновленные изображения.
Мой исходный код не имеет значения. Прочтите вики и реализуйте свой собственный рендерер. Только пережив все мельчайшие детали, вы узнаете, что происходит.
В этой серии статей я хочу показать, как работает OpenGL, написав его клон (значительно упрощенный). Как ни удивительно, я часто встречаю людей, которые не могут преодолеть начальный барьер изучения OpenGL/DirectX. Поэтому я подготовил небольшой цикл лекций, после которых мои ученики демонстрируют неплохие рендеры.
Итак, задача формулируется так: не используя сторонние библиотеки (особенно графические), получить примерно такую картину:
Внимание: это обучающий материал, который во многом повторяет структуру библиотеки OpenGL. Это будет программный рендерер. Я не хочу показывать, как писать приложения под OpenGL. Я хочу показать, как работает OpenGL. Я глубоко убежден, что без понимания этого невозможно писать эффективные приложения с использованием 3D-библиотек.
Я постараюсь сделать окончательный код около 500 строк. Моим студентам нужно от 10 до 20 часов программирования, чтобы начать создавать такие рендереры. На вход получаем тестовый файл с полигональным проводом + картинки с текстурами. На выходе мы получим отрендеренную модель — никакого графического интерфейса, а программа просто генерирует изображение.
Поскольку цель — минимизировать внешние зависимости, я даю своим ученикам только один класс, позволяющий работать с файлами TGA. Это один из простейших форматов, поддерживающий изображения в форматах RGB/RGBA/черно-белые. Итак, в качестве отправной точки мы получим простой способ работы с картинками. Следует отметить, что единственный функционал, доступный в самом начале (помимо загрузки и сохранения изображений), — это возможность задать цвет одного пикселя.
Функции рисования отрезков линий и треугольников отсутствуют. Нам придется делать все это вручную. Предоставляю свой исходный код, который пишу параллельно со студентами. Но я бы не рекомендовал его использовать, так как это не имеет смысла. Полный код доступен на GitHub, а здесь вы найдете исходный код, который я даю своим ученикам.
# include " tgaimage.h "
const TGAColor white = TGAColor( 255 , 255 , 255 , 255 );
const TGAColor red = TGAColor( 255 , 0 , 0 , 255 );
int main ( int argc, char ** argv) {
TGAImage image ( 100 , 100 , TGAImage::RGB);
image. set ( 52 , 41 , red);
image. write_tga_file ( " output.tga " );`
return 0 ;
}
output.tga должен выглядеть примерно так: