Компьютерная графика или программирование
Многие в нашем сообществе мечтают разрабатывать игры или работать с графикой. Мы спросили у экспертов, с чего в этом деле лучше начинать и на что обратить внимание в процессе.
Разработка игр – дело непростое, многогранное. Я уверен, что тот, кто задумал разработать игру, может подступиться к этому вопросу с совершенно разных сторон. И, на мой взгляд, начинать с технической стороны не совсем верно. Ты можешь быть гением Unity или двухмерного движка типа phaser.js и все равно сделать неинтересную игру низкого качества. Игры – это не только техническая реализация: любая хорошая игра – это синергия звука, цвета, движения и, на мой взгляд, самого главного – сценария, истории. Именно она позволяет игрокам полноценно окунуться в мир игры, забыв обо всем на свете. В данном разрезе я призываю игнорировать игры вроде Счастливого фермера или Candy Crush. У них нет толковой сценарной составляющей, но они все равно ужасно затягивают, не благодаря их качеству, а потому что «играют» на умении мозга получать удовольствие от малейшего стимула. Такие игры, сочетая простоту и красочность, делают зависимыми от них. Кто-то из гейм-индустрии сказал о том, что игра, которая заставляет тебя думать о ней все время, плохая, наркотик.
С чего начать разрабатывать игру? С истории и сюжета. Любая техническая сторона вспомогательна. Если кто-то скажет, что только гигантские корпорации, разрабатывающие 3D игры и миры, выпускают качественные продукты, то они не слышали об успешных инди-играх вроде Hotline Miami 1/2, Meat Boy, Fez. Они, может быть, не блещут графикой, но зато сверкают своим глубоким миром, который приглашает миллионы людей окунуться в волшебное пространство игры.
Многие студенты, приходя на первый курс, мечтают работать в игровой индустрии. Цель, заслуживающая уважения, так как в эту область программирования достаточно тяжело попасть. Она подразумевает огромные затраты времени при относительно низких зарплатах, не говоря уже о других сложностях. Одна из главных проблем заключается в том, что компаниям очень легко найти программистов, готовых работать за небольшую плату. В то же время у них есть ощутимый недостаток в специалистах, способных создавать дизайн, писать и рисовать. Игровой дизайн все больше требует от программистов междисциплинарности. Для этого можно изучать гуманитарные предметы: творческое письмо, фильмы, музыку, изящное искусство и т.д.
С технической стороны, лучший совет — не начинать сразу с масштабных проектов. Начните с проекта менее требовательного — скорее допустите первые ошибки, невероятно важные для обучения. К примеру, вы можете создать бета версии игр и позволить другим людям поиграть в них. Так вы сможете узнать их мнение о вашем продукте. Короткие итерационные циклы вместе с отчетами по ним позволяют легко решить проблемы и сохранять мотивацию.
Вообще, разработка игры мало отличается от разработки любого другого приложения. Основное отличие — производительность. Если десктопное/мобильное приложение довольно терпимо к задержке, допустим, в полсекунды, при игре эта задержка может быть критичной.
Поэтому в первую очередь нужно иметь хороший алгоритмический базис (не зря его пишут в наших требованиях в вакансиях), а также знать структуры данных, и уметь все это эффективно применять.
Книжек по алгоритмам и структурам данных огромное множество. Очень хороша книжка Роберта Седжвика про алгоритмы. Как java-разработчик, могу ее рекомендовать.
Также, если иметь дело с графикой (в любом проявлении, от перемещения двухмерных объектов по экрану до разработки собственного движка), нужна математика. Чем глубже занятие графикой, тем глубже нужна математика. Для примера можно изучить статью нашего технического директора Сергея Макеева про технологии рендеринга в нашем игровом клиенте. Думаю, к нему же можно обратиться за более подробным описанием того, что нужно для подобной разработки.
Если заниматься разработкой гейм-механики, то уже нужны будут хорошие знания теории вероятностей и мат. статистики. Тут лучше обратиться к нашим гейм-дизайнерам или разработчикам игровой механики.
В принципе, все эти навыки/знания будут полезны любым программистам. Но при разработке игр без них просто никак.
Ну и главное, нужно любить игры 🙂
Учить матанализ, аналитическую геометрию, математику и диффуры. Дать им ссылки на статьи по графике Skyforge с хабра (должно быть 3 штуки). Это если графика.
Если сервер, то учить алгоритмы, теорию вероятностей, статистику, алгоритмы еще раз.
Если мобильная разработка, то ничего учить особо не нужно — нужен просто знакомый художник и куча времени 🙂
В тех же статьях на хабре есть подборка литературы по теме графики.
Попробуйте написать интересную вам игру. А дальше приложится.
Общаясь с разработчиком игр, я выяснил, что главным ограничивающим фактором быстродействия игры является обращение в память по произвольным адресам. Например, при выяснении «ближайших» предметов или проверки столкновений.
Внимание, вопрос: можем ли мы избежать полностью или уменьшить количество обращений в произвольные (не последовательные) адреса памяти?
В последние годы я всё чаще слышу подобные фразы: программирование графики теперь настолько сложно изучать, что это демотивирует людей осваивать его как хобби и/или профессию, или заставляет их сдаться. Я глубоко очарован этой областью программирования, поэтому подобные комментарии всегда бьют по больному. Программирование графики для игр — это специализация, приносящая невероятное удовольствие, она постоянно эволюционирует и обновляется, к тому же имеет (по большей части) одно из лучших сообществ программистов, развивающееся благодаря активному обмену информацией. Так что же происходит?
Это сложно объяснить, но произносящие такие фразы в чём-то правы.
Когда я начал писать этот пост пару месяцев назад, он был совершенно другим, по сути, в нём аргументировалась необходимости создания высокоуровневой (как DX11, но лучше) API-обёртки для D3D12.
Но чем больше я писал, тем сильнее понимал, что проблема сложнее, чем кажется, а после публикации этого опроса в Twitter я убедился, что единого, подходящего всем решения для изучения графики больше не существует.
Кто-то может сказать «но и раньше его не было», и будет прав, но за последние годы разрыв увеличился. Давайте поговорим об этом.
SDL 2.0
SDL — кроссплатформенная 2D-библиотека, предназначенная для написания приложений (в основном игр). Поддерживаются Windows, Linux, Mac OS, а также Android, Windows Mobile и iOS. Преимущества библиотеки — быстрота, надёжность и лёгкость в эксплуатации. Также в библиотеке реализованы профессиональные инструменты для работы со звуком — это большой плюс при разработке крупных проектов.
Комбинируется с wxWidgets и хорошо интегрируется с OpenGL.
Существует целый цикл уроков, размещённый на Habr.
Пожалуй, одна из самых известных графических библиотек. GTK+ — графический фреймворк, широко применяемый во многих системах. Изначально он задумывался как компонент GIMP, но за 20 лет после выпуска первой стабильной версии он нашёл применение в сотнях других приложений.
Сейчас GTK+ — это полноценный графический фреймворк, не уступающий тому же QT. Он поддерживает разные языки программирования и продолжает развиваться.
В своё время библиотека создавалась в качестве альтернативы Qt, которая была платной. GTK+ — один из немногих фреймворков, которые поддерживают язык C. Библиотека кроссплатформенная, но есть мнение, что программы на Linux выглядят более нативно, чем на Windows или Mac OS (GTK+ хорошо поддерживается даже на KDE). Интересно, что из-за некоторых проблем с кроссплатформенностью Wireshark перешла на Qt.
Пример первой программы можно посмотреть на Википедии.
«Фулстек-программистов» графики больше нет
Именно это расстраивает многих людей, не понимающих, что за последние несколько лет ситуация в отрасли значительно изменилась. Можно спорить о том, когда это случилось конкретно, но думаю, можно сказать, что смерть фулстек-программиста графики произошла примерно в 2013 году. Для контекста добавлю, что в этом же году я начал работать в этой сфере, поэтому в то время многие изменения остались для меня незамеченными.
В 2013 году отрасль начала эволюционировать в сторону усложнения программирования игровой графики. С одной стороны, в играх появился физически корректный рендеринг (PBR), что видно из этого курса SIGGRAPH 2013: Physically Based Shading in Theory and Practice; с другой стороны, был выпущен Mantle API компании AMD.
Это означало, что игровая графика была на грани значительного расширения возможностей, и на то были причины. Благодаря PBR мы совершили рывок из эпохи Блинна-Фонга и стремились переосмыслить конвейеры создания графики, а Mantle обеспечивал нам низкоуровневый API, наконец-то давший инструменты для снижения нагрузки на ЦП, повышаемой функциями графического CPU (например, вызовами отрисовки или созданием конвейеров), что в то время считалось основным ограничивающим фактором. До этого программисты графики часто работали над всеми уровнями «стека», но сегодня такое можно увидеть всё реже. Кажется, впервые наглядно я увидел это в «The Technical Interview [LEAKED]» Анджело Пеше.
Хотя разделение на подспециализации в игровой графике зависит от проекта, оно бесспорно существует. Помните об этом, когда ощутите, что в разработке графики слишком много всего, и уделите время выбору той специализации, которая интереснее вам больше всего.
Лично я тяготею к специализации на движках/API и имеют посредственное (но достаточное) понимание других областей, а если бы вы посмотрели на ребят, которых я нанимал в нашу команду ZeniMax Online Studio, то увидели бы, что я искал людей с разной экспертизой, чтобы закрыть весь необходимый спектр знаний. Вместе мы образуем всесторонне развитую команду!
Если вас привлекла эта сфера, то вы, вероятно, задаётесь вопросом, с чего же начать. Судя по моему опросу, «правильной» точки старта не существует; по крайней мере, невозможно найти ту, с которой были бы согласны все специалисты. Вот мои рекомендации с учётом этого (на момент написания статьи, 2021 год).
Книги
Если вы хотите изучить ресурсы, которые будут актуальны всегда и дают фундаментальные знания, то рекомендую прочитать Foundations of Game Engine Development и Real-Time Rendering.
Что если я скажу, что мир не настоящий, а хорошо проработанная компьютерная графика, помещенная в виртуальную реальность? Тогда создатель этого мира по праву может считать себя богом. Звучит как сюжет фантастического фильма? Дайте CG десяток лет, и фантазии превратятся в пугающую реальность.
Однако, уже сейчас освоив компьютерную графику вы сможете использовать ее для веб-дизайна, 3D-игр, 3D-печати, анимации, виртуальной реальности, архитектурной визуализации, эффектов для кино и многого другого. В этой статье мы разберем основы компьютерной графики и ответим на два важных вопроса: “С чего начать?” и “Какой софт использовать?”. Сосредоточьтесь, мы начинаем.
Компьютерная графика или по другому CG — Computer Graphics разделяется на двумерную и трехмерную. Хоть статья в основном о 3D графике, скажу пару слов о 2D.
«Фулстек-программистов» графики больше нет
Именно это расстраивает многих людей, не понимающих, что за последние несколько лет ситуация в отрасли значительно изменилась. Можно спорить о том, когда это случилось конкретно, но думаю, можно сказать, что смерть фулстек-программиста графики произошла примерно в 2013 году. Для контекста добавлю, что в этом же году я начал работать в этой сфере, поэтому в то время многие изменения остались для меня незамеченными.
В 2013 году отрасль начала эволюционировать в сторону усложнения программирования игровой графики. С одной стороны, в играх появился физически корректный рендеринг (PBR), что видно из этого курса SIGGRAPH 2013: Physically Based Shading in Theory and Practice; с другой стороны, был выпущен Mantle API компании AMD.
Это означало, что игровая графика была на грани значительного расширения возможностей, и на то были причины. Благодаря PBR мы совершили рывок из эпохи Блинна-Фонга и стремились переосмыслить конвейеры создания графики, а Mantle обеспечивал нам низкоуровневый API, наконец-то давший инструменты для снижения нагрузки на ЦП, повышаемой функциями графического CPU (например, вызовами отрисовки или созданием конвейеров), что в то время считалось основным ограничивающим фактором. До этого программисты графики часто работали над всеми уровнями «стека», но сегодня такое можно увидеть всё реже. Кажется, впервые наглядно я увидел это в «The Technical Interview [LEAKED]» Анджело Пеше.
Хотя разделение на подспециализации в игровой графике зависит от проекта, оно бесспорно существует. Помните об этом, когда ощутите, что в разработке графики слишком много всего, и уделите время выбору той специализации, которая интереснее вам больше всего.
Лично я тяготею к специализации на движках/API и имеют посредственное (но достаточное) понимание других областей, а если бы вы посмотрели на ребят, которых я нанимал в нашу команду ZeniMax Online Studio, то увидели бы, что я искал людей с разной экспертизой, чтобы закрыть весь необходимый спектр знаний. Вместе мы образуем всесторонне развитую команду!
Если вас привлекла эта сфера, то вы, вероятно, задаётесь вопросом, с чего же начать. Судя по моему опросу, «правильной» точки старта не существует; по крайней мере, невозможно найти ту, с которой были бы согласны все специалисты. Вот мои рекомендации с учётом этого (на момент написания статьи, 2021 год).
Cairo
Cairo — библиотека для отрисовки векторных изображений под Linux, Windows и Mac OS. К примеру, такой крупный проект, как Mozilla, использует Cairo в браузерном движке Gecko. Также Cairo лежит в основе некоторых операционных систем (MorphOS, AmigaOS) и приложений (InkScape, Synfig, Graphite). При использовании библиотеки будьте готовы к отсутствию русскоязычных ресурсов.
Cairo может взаимодействовать с OpenGL бэкендом с поддержкой GPU, что, конечно, открывает целый список полезных функций.
Cocos2D-X
Кроссплатформенная библиотека Cocos2D-X призвана упростить разработку мобильных игр. Поддерживает все те же платформы, что и Qt. Из плюсов стоит отметить доступность, удобство эксплуатации и создание отдельного конструктора игр, основанного на библиотеке Cocos Creator. В списке игр, основанных на движке, есть всемирно известная BADLAND, работающая на всех доступных платформах.
Если при создании игры вам нужно работать с графикой и анимацией в больших объёмах, то лучше использовать Unity вместо Cocos2D-X. Unity имеет возможность плавной интеграции с такими инструментами, как Photoshop, Maya или Blender. В Cocos2D-X вся графика добавляется извне и на неё ссылаются из кода.
В Рунете нет уроков по этой библиотеке, но на английском языке есть отличный курс от разработчиков.
Juce — кроссплатформенный фреймворк, предназначенный для создания приложений и плагинов на языке C++.
Документации по Juce много, но не на русском языке. Поэтому можно скачать книгу «Программирование на C++ с JUCE 4.2.x: Создание кроссплатформенных мультимедийных приложений с использованием библиотеки JUCE на простых примерах».
Juce больше популярен среди разработчиков аудио — ПО благодаря набору интерфейсов-оболочек для построения аудио плагинов.
С чего мне начинать?
«Я не знаю, чего хочу, или хочу познакомиться с большинством аспектов программирования графики»
«Мне хочется чего-то визуального и с быстрой обратной связью, или я хочу узнать, как писать шейдеры»
Вы не ошибётесь, начав с Shadertoy. На сайте есть множество написанных сообществом туториалов и примеров для любого уровня опыта, а также примеры по любой теме, связанной с затенением. Вам не придётся думать о графических API или заниматься их настройкой. Это самое удобное место для использования в качестве графической «песочницы».
«Я хочу понимать графический конвейер и архитектуру на низком уровне»
Если вы хотите сильно углубиться: рекомендую начать с изучения D3D12 или Vulkan. Если вам неинтересны мобильные платформы, то выберите D3D12; мне кажется, он требует меньше мыслительных усилий и времени, однако за это придётся расплачиваться тем, что современные ресурсы для изучения не всегда хороши.
Для изучения D3D12 начните с github, где собраны примеры по D3D12, в частности, с примеров «hello world»:
В процессе воссоздания примеров сверяйтесь с руководством по программированию и справочной документацией:
Хорошей целью для обучения может стать создание высокоуровневой обёртки для выбранного вами API. Занявшись ею, вы многое узнаете об API и абстракциях. В начале пути не стоит забывать о множестве ресурсов для новичков на github (DirectXTex, Vulkan Memory Allocator, D3D12 Memory Allocator, DirectX Shader Compiler, и т. д.).
Я пишу туториал для новичков в D3D12, используя более современные концепции, и надеюсь опубликовать его в ближайшем будущем. Мне кажется, в нём есть необходимость.
Если вам нужно более поверхностное знакомство: рекомендую изучить D3D11 или OpenGL на основе множества доступных ресурсов (на один из них я дал ссылку выше). Если у вас нет конкретных предпочтений, то рекомендую D3D11, потому что поиск примеров и туториалов по OpenGL различных версий может вас запутать. Изученное вами на этом уровне останется полезным, если вы захотите изучать более низкоуровневые API.
Я понимаю, почему многие могли потерять мотивацию, поэтому и создал свой опрос в Twitter. Хотелось бы, чтобы в D3D11 были новые функции, которые появились только в D3D12, но для их отсутствия есть причины. Если бы эти функции были, или если бы у нас была официальная высокоуровневая обёртка поверх D3D12, то я бы порекомендовал её. Судя по результатам моего опроса, многие хотят иметь такую штуку, и в целом люди предпочитают, чтобы авторитеты в отрасли (например, Microsoft) предоставляли её, а мы не были вынуждены подбирать разные сторонние варианты на github.
Не заставляйте себя изучать тонкости D3D12/Vulkan, если в процессе изучения вы настолько выдохлись, что уже готовы отказаться от разработки графики. Нет ничего плохого в изучении более старых API, чтобы сначала лучше уяснить высокоуровневые концепции, а уже потом переходить к низкоуровневым API, чтобы понять, как они устроены внутри.
«Я хочу изучить рендеринг»
Пропустите этап платформенных API и переходите напрямую к сторонним абстракциям. Есть много вариантов на выбор, лично я рекомендую вам bgfx. Он достаточно высокоуровневый, чтобы не вдаваться в подробности внутреннего устройства и иметь возможность работы с высокоуровневыми концепциями. Также у него есть справочная документация по API, десятки примеров проектов, сообщество и выпущенные игры.
Если вы хотите рассмотреть альтернативы, то изучите The Forge, Sokol и Wicked Engine.
«Я хочу научиться писать функции, с которыми будут взаимодействовать художники»
Скачайте Unreal, Unity или Godot и начните читать туториалы по тому, как в них работать. Несколько лет назад я не задумываясь порекомендовал бы Unity, но теперь в нём есть три разных конвейера, что усложняет освоение и использование графических технологий движка, особенно для новичков. На данный момент я не знаю точно, какой из трёх лучше подойдёт для простоты обучения. Попробуйте каждый и остановитесь на том, который понравился больше.
wxWidgets
wxWidgets — одна из старейших, но в то же время наиболее известных графических библиотек для отрисовки GUI. Её основной плюс — производительность. Если QT использует низкоуровневый код лишь для таких элементов, как кнопки и полосы прокрутки, то wxWidgets для каждой системы свой, и благодаря этому все элементы отображаются максимально похожими на системный стиль.
Важная особенность wxWidgets заключается в использовании «родных» графических элементов интерфейса операционной системы везде, где это возможно. Это существенное преимущество для многих пользователей, поскольку они привыкают работать в конкретной среде, а изменения интерфейса программ часто вызывают затруднения в их работе.
В Сети есть урок по работе с библиотекой от её разработчиков.
Заключение
Всегда следует учитывать особенности той или иной технологии. Выпишите список функций своего приложения, ещё раз прочитайте описания всех графических библиотек C++, и только после этого выбирайте то, что подойдёт вам больше всего.
Fast Light Toolkit
FLTK (произносится как «фуллтик») — графическая библиотека, которая работает на Windows, Linux (X11) и Mac OS. Поддерживает 3D графику с помощью OpenGL и имеет встроенный GLUT симулятор. Есть встроенный софт для создания интерфейсов — FLUID. Документация по библиотеке находится здесь.
Nana — это кроссплатформенная библиотека для программирования GUI в стиле современного C++. Поддерживаемые системы: Windows, Linux (X11) и Mac OS (экспериментально). Поддержка С++11\17 даёт возможность использовать современные фичи C++: лямбды, умные указатели и стандартную библиотеку. Так как это не фреймворк, использование Nana не будет оказывать влияния на архитектуру программы.
Здесь можно посмотреть документацию и примеры.
Трехмерная графика
Независимо от того, в какой области вы хотите развиваться, базовое понимание 3D необходимо во всех, и то, что вы узнаете в одной области, часто можно применить в другой. Скажем, вы смоделировали персонажа. Можно нацепить на него скелет и анимировать, чтобы создать короткометражный мультик или же экспортировать его в игровой движок как персонажа. Его можно напечатать на 3D принтере, внедрить в виртуальную реальность, или просто сделать красивой отрендеренной картинкой. Так что начало работы с любой из этих областей требует базового понимания 3D. И что же это за основы? Ну, их можно сформулировать так:
1. Моделирование — самая популярная технология создания объектов в трехмерной графике — создание полигональной сетки. Это значит, что объект описывается вершинами, соединяющими их ребрами и гранями. То есть любой персонаж игры или кино — геометрическая фигура, состоящая из множества граней. По простому вы создаете сетку и деформируете, пока она не примет форму вашего объекта.
2. Текстурирование — создание текстур и материалов, чтобы поверхность выглядела реалистично при рендере. К этому же пункту относится Шейдинг — указание какие участки модели должны обладать оптическими эффектами: матовость или глянцевость.
3. Свет — настройка освещения для создания приятного финального изображения при рендере. Ничто не будет выглядеть естественно, если оно освещено примитивными источниками света. В играх используются точечные источники света, параллельные — для имитации условно бесконечно удаленных источников вроде Солнца и эмбиент — то есть просто подсветка без конкретно расположенного источника и, соответственно, теней. И глобальное освещение со множественными отскоками виртуальных фотонов — позволяющее критически добавить сцене реалистичности ценой десятка кликов и значительного увеличения времени рендера.
4. Анимация — создание скелета и анимирование.
Вот и все основные пункты. Думаю, для начала этого будет достаточно. К нашему списку еще можно добавить еще два пункта, которые ближе к работе с видео и кино.
5. Композ — многослойный монтаж, который используется для объединения всего съемочного материала в кадре.
6. Симуляция частиц — система точек в виртуальном пространстве. Сами по себе они не имеют визуальной составляющей, но таковую можно навесить поверх.
Частички полезны в системах, когда они как-то взаимодействуют с другими частичками рядом. В зависимости от правил этого взаимодействия, система частиц может вести себя похожим на воду, огонь, песок, желе, снег и еще много каким образом, подчиняясь заданным в симуляции силам и взаимодействуя с объектами в сцене. Например, эффекты магии в фентезийных фильмах созданы как раз на основе симуляции частиц.
Представим, что нам нужно создать магический меч для MMO игры. Моделируем путем деформации сетки, накладываем текстуру и добавляем свет. Теперь мы можем распечатать его на принтере или отрендерить в картинку. Меч двигается? Ну, это MMO, там всякое бывает. Допустим, создали скелет, анимаровали. Нужен магический эффект? Используем симуляцию. Упаковать это все в красивый трейлер — композ. Анимированный меч
Так что вот, с чего начать — с изучения основ. Теперь следующий вопрос. Он довольно непростой. Какое программное обеспечение мне использовать? Некоторые говорят, что нужно использовать то, что использую крупные студии, но в индустрии нет какого-либо определенного стандарта.
Вопрос становится еще более пугающим из за обилия вариантов. Компания Blizzard использует 3ds max, Maya, Zbrush, Mudbox. Disney — Maya и Zbrush. Некоторые студии вроде Pixar используют созданный внутри студии софт, который недоступен общественности. Для первых этапов в компьютерный графике нужен софт, который прост в освоении и не сильно дорогой. Думаю, в этом случае лучше всего подойдет программа Blender. Она распространяется по бесплатной лицензии, а скачать ее можно даже в steam.
Компьютерная графика уже очень очень востребованная сфера, а в будущем станет еще более востребованной. Читайте книги по моделированию, смотрите видео (благо таких предостаточно). И когда-нибудь в будущем сможете создать свой мир с блэкджеком и анимированными мечами.
Что если я скажу, что мир не настоящий, а хорошо проработанная компьютерная графика, помещенная в виртуальную реальность? Тогда создатель этого мира по праву может считать себя богом. Звучит как сюжет фантастического фильма? Дайте CG десяток лет, и фантазии превратятся в пугающую реальность.
Однако, уже сейчас освоив компьютерную графику вы сможете использовать ее для веб-дизайна, 3D-игр, 3D-печати, анимации, виртуальной реальности, архитектурной визуализации, эффектов для кино и многого другого. В этой статье мы разберем основы компьютерной графики и ответим на два важных вопроса: “С чего начать?” и “Какой софт использовать?”. Сосредоточьтесь, мы начинаем.
Компьютерная графика или по другому CG — Computer Graphics разделяется на двумерную и трехмерную. Хоть статья в основном о 3D графике, скажу пару слов о 2D.
Двумерная графика
Двумерную графику обычно разделяют на векторную и растровую, хотя отдельно называют еще и фрактальный тип обособления изображений, говорить о котором мы не будем. Это тема отдельной статьи.
Векторная графика — представляет из себя набор геометрических примитивов, например: точки, прямые, окружности, прямоугольники. На страницах web-сайтов вектор можно увидеть в качестве шрифтов, иконок, логотипов. Вектор может без потерь масштабироваться, поворачиваться, деформироваться, также имитировать трехмерную графику, чем не может похвастаться растровая графика, которая берет за основу пиксели.
Растровая графика — всегда оперирует матрицей пикселей. Каждому пикселю сопоставляется значение яркости, цвета, прозрачности или комбинация этих значений. В растровом виде представимо любое изображение, однако этот способ хранения имеет свои недостатки: больший объём памяти, необходимый для работы с изображениями, потери при редактировании. Как пример растра — любые картинки, изображения, фотографии.
Это все очень интересно, теперь у вас есть базовое понимание о двумерной графике, которое пригодится веб-дизайнерам, 2D аниматорам, художникам. А теперь перейдем к графике будущего.
Трехмерная графика
Независимо от того, в какой области вы хотите развиваться, базовое понимание 3D необходимо во всех, и то, что вы узнаете в одной области, часто можно применить в другой. Скажем, вы смоделировали персонажа. Можно нацепить на него скелет и анимировать, чтобы создать короткометражный мультик или же экспортировать его в игровой движок как персонажа. Его можно напечатать на 3D принтере, внедрить в виртуальную реальность, или просто сделать красивой отрендеренной картинкой. Так что начало работы с любой из этих областей требует базового понимания 3D. И что же это за основы? Ну, их можно сформулировать так:
1. Моделирование — самая популярная технология создания объектов в трехмерной графике — создание полигональной сетки. Это значит, что объект описывается вершинами, соединяющими их ребрами и гранями. То есть любой персонаж игры или кино — геометрическая фигура, состоящая из множества граней. По простому вы создаете сетку и деформируете, пока она не примет форму вашего объекта.2. Текстурирование — создание текстур и материалов, чтобы поверхность выглядела реалистично при рендере. К этому же пункту относится Шейдинг — указание какие участки модели должны обладать оптическими эффектами: матовость или глянцевость.
2. Текстурирование — создание текстур и материалов, чтобы поверхность выглядела реалистично при рендере. К этому же пункту относится Шейдинг — указание какие участки модели должны обладать оптическими эффектами: матовость или глянцевость.3. Свет — настройка освещения для создания приятного финального изображения при рендере. Ничто не будет выглядеть естественно, если оно освещено примитивными источниками света. В играх используются точечные источники света, параллельные — для имитации условно бесконечно удаленных источников вроде Солнца и эмбиент — то есть просто подсветка без конкретно расположенного источника и, соответственно, теней. И глобальное освещение со множественными отскоками виртуальных фотонов — позволяющее критически добавить сцене реалистичности ценой десятка кликов и значительного увеличения времени рендера.
3. Свет — настройка освещения для создания приятного финального изображения при рендере. Ничто не будет выглядеть естественно, если оно освещено примитивными источниками света. В играх используются точечные источники света, параллельные — для имитации условно бесконечно удаленных источников вроде Солнца и эмбиент — то есть просто подсветка без конкретно расположенного источника и, соответственно, теней. И глобальное освещение со множественными отскоками виртуальных фотонов — позволяющее критически добавить сцене реалистичности ценой десятка кликов и значительного увеличения времени рендера.
4. Анимация — создание скелета и анимирование.
Вот и все основные пункты. Думаю, для начала этого будет достаточно. К нашему списку еще можно добавить еще два пункта, которые ближе к работе с видео и кино.
5. Композ — многослойный монтаж, который используется для объединения всего съемочного материала в кадре.
6. Симуляция частиц — система точек в виртуальном пространстве. Сами по себе они не имеют визуальной составляющей, но таковую можно навесить поверх.
Частички полезны в системах, когда они как-то взаимодействуют с другими частичками рядом. В зависимости от правил этого взаимодействия, система частиц может вести себя похожим на воду, огонь, песок, желе, снег и еще много каким образом, подчиняясь заданным в симуляции силам и взаимодействуя с объектами в сцене. Например, эффекты магии в фентезийных фильмах созданы как раз на основе симуляции частиц.
Представим, что нам нужно создать магический меч для MMO игры. Моделируем путем деформации сетки, накладываем текстуру и добавляем свет. Теперь мы можем распечатать его на принтере или отрендерить в картинку. Меч двигается? Ну, это MMO, там всякое бывает. Допустим, создали скелет, анимаровали. Нужен магический эффект? Используем симуляцию. Упаковать это все в красивый трейлер — композ. Анимированный меч
Так что вот, с чего начать — с изучения основ. Теперь следующий вопрос. Он довольно непростой. Какое программное обеспечение мне использовать? Некоторые говорят, что нужно использовать то, что использую крупные студии, но в индустрии нет какого-либо определенного стандарта.Вопрос становится еще более пугающим из за обилия вариантов. Компания Blizzard использует 3ds max, Maya, Zbrush, Mudbox. Disney — Maya и Zbrush. Некоторые студии вроде Pixar используют созданный внутри студии софт, который недоступен общественности. Для первых этапов в компьютерный графике нужен софт, который прост в освоении и не сильно дорогой. Думаю, в этом случае лучше всего подойдет программа Blender. Она распространяется по бесплатной лицензии, а скачать ее можно даже в steam.
Вопрос становится еще более пугающим из за обилия вариантов. Компания Blizzard использует 3ds max, Maya, Zbrush, Mudbox. Disney — Maya и Zbrush. Некоторые студии вроде Pixar используют созданный внутри студии софт, который недоступен общественности. Для первых этапов в компьютерный графике нужен софт, который прост в освоении и не сильно дорогой. Думаю, в этом случае лучше всего подойдет программа Blender. Она распространяется по бесплатной лицензии, а скачать ее можно даже в steam.
…мы ищем обширные художественные и технические навыки, а не способность запускать программы.
— Pixar, Careers Page
Чтобы стать хорошим специалистом в CG потребуется освоить много сложной, но не менее интересной информации. Вот небольшая подборка интернет ресурсов, которые могут вам помочь:
Компьютерная графика уже очень очень востребованная сфера, а в будущем станет еще более востребованной. Читайте книги по моделированию, смотрите видео (благо таких предостаточно). И когда-нибудь в будущем сможете создать свой мир с блэкджеком и анимированными мечами.
Компьютерная графика уже очень очень востребованная сфера, а в будущем станет еще более востребованной. Читайте книги по моделированию, смотрите видео (благо таких предостаточно). И когда-нибудь в будущем сможете создать свой мир с блэкджеком и анимированными мечами.
Графические библиотеки для C++ позволяют сделать разработку UI приложений максимально быстрой и удобной. Рассказываем, на какие стоит обратить внимание.
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
SFML (Simple and Fast Multimedia Library) — одна из самых удобных и быстрых графических библиотек для C++. Её неоспоримое преимущество — минимальные требования к уровню знаний языка и лёгкость освоения: всего за несколько дней можно написать вполне полноценную программу. К примеру, первое графическое приложение «SFML works!» можно написать всего за минуту. Ещё одно преимущество — кроссплатформенность: SFML работает под Windows, Linux (только X11, но не Wayland) и Mac OS, планируется выход под Android и iOS.
SFML библиотека используется по большей части небольшими стартапами и программистами, для которых создание игр — хобби. SFML популярен среди небольших команд благодаря тому, что разработка графической части программы не требует написания больших объёмов кода.
Qt представляет собой целый набор инструментов для быстрого и удобного проектирования GUI. Конечно же, здесь можно писать и игры — почему бы и нет? — но Qt привлекает программистов в основном тем, что она является быстрой, удобной, гибкой и кроссплатформенной. Во многом Qt обогнала даже SFML: библиотека доступна как на Windows, Linux и Mac OS, так и на мобильных платформах — Windows Mobile, Android и iOS.
Qt расширяет C++ с помощью МОК (Мета-объектного компилятора) и предоставляет дополнительные функции (например, сигналы и слоты). Также имеет платную службу поддержки (как и платную лицензию). Для Qt есть большой выбор IDE: QtDesigner, QtCreator, QDevelop, Edyuk, а также доступна интеграция с Visual Studio, Eclipse и XCode.
Qt является open source продуктом, в разработке которого можно принять участие. О других open source проектах для C++ читайте в нашей статье.
Вы можете пройти готовый курс по данной библиотеке.
Двумерная графика
Двумерную графику обычно разделяют на векторную и растровую , хотя отдельно называют еще и фрактальный тип обособления изображений, говорить о котором мы не будем. Это тема отдельной статьи.
Векторная графика — представляет из себя набор геометрических примитивов, например: точки, прямые, окружности, прямоугольники. На страницах web-сайтов вектор можно увидеть в качестве шрифтов, иконок, логотипов. Вектор может без потерь масштабироваться, поворачиваться, деформироваться, также имитировать трехмерную графику, чем не может похвастаться растровая графика, которая берет за основу пиксели.
Растровая графика — всегда оперирует матрицей пикселей. Каждому пикселю сопоставляется значение яркости, цвета, прозрачности или комбинация этих значений. В растровом виде представимо любое изображение, однако этот способ хранения имеет свои недостатки: больший объём памяти, необходимый для работы с изображениями, потери при редактировании. Как пример растра — любые картинки, изображения, фотографии.
Это все очень интересно, теперь у вас есть базовое понимание о двумерной графике, которое пригодится веб-дизайнерам, 2D аниматорам, художникам. А теперь перейдем к графике будущего.
Читайте также: