Хочу всё знать. Языки управления шейдерами

HLSL, GLSL, CG, ARB и Metal.
25 сентября 2017326451Илья Бубнов1872213

Каждому увлекающемуся компьютерными играми гику известно понятие шейдера. Это компьютерная программа, исполняемая на видеокарте и, соответственно, отвечающая за графику в играх и мультимедиа. От того, насколько грамотно написаны шейдеры, зависит и визуальная составляющая, и fps (количество кадров в секунду).

Для написания шейдеров используются специальные языки программирования. Как правило, это упрощенные версии популярных представителей, часто С, содержащие специальные типы данных, такие как цвет, нормаль, вес, объем и т.д. Программирование на них сводится преимущественно к математическим операциям. Поэтому если вы плохо представляете, как изобразить на графике фигуру, похожую на молнию, лезть в дебри шейдеров пока рано.

Основные языки шейдеров:

  1. HLSL
  2. GLSL
  3. CG
  4. Metal
  5. ARB assembly language

Фактически языков создания шейдеров значительно больше. Так, к примеру, есть свой язык для PlayStation 4 или Adobe Flash, однако указанные популярнее и охватывают больше устройств. О них мы поговорим далее.

HLSL

Разработан компанией Microsoft и появился на свет в 2002 году. Поддерживается только консолями Xbox и устройствами с DirectX, то есть машинами под управлением Windows. Является переработанной версией С, содержащей большое количество операторов для проведения математических операций и работы со структурами.

Научиться программировать на HLSL, пожалуй, проще всего из-за огромного количества доступной информации. Вот несколько полезных ресурсов:

  1. Официальный программный гид от Microsoft.
  2. Большой вводный курс от Neatware.
  3. Курс по шейдерам на основе HLSL от RB Whitaker.

GLSL

Он же OpenGL язык шейдеров, он же glslang. Был выпущен Microsoft, также базируется на синтаксисе С с добавлением функций для работы с векторами и матрицами. Является языком высокого уровня, кроссплатформенным, то есть позволяет создавать программы для любого устройства с поддержкой OpenGL. Производительность с использованием GLSL будет не лучше, чем при использовании платформенных языков, но из универсальных инструментов, этот лучший.

По GLSL в сети тоже много крутых статей и уроков, вот несколько:

  1. Подробный материал по языку от TyphoonLabs с примерами программ, блок-схемами и теорией.
  2. Электронная книга на русском языке от Wingman.
  3. Введение в GLSL от NeHe.

CG

Высокоуровневый язык программирования от Nvidia, разработанный в тесном сотрудничестве с Microsoft. Именно его вы используете при работе с Unity, Unreal Engine, в Autodesk Maya и Adobe Photoshop. Несмотря на то, что последняя версия 3.1 вышла 5 лет назад и язык с тех пор не развивается, CG по-прежнему активно используют разработчики игр и графических приложений. Вот пара интересных публикаций для ознакомления и обучения:

  1. Официальный туториал от Nvidia.
  2. Викикнига по языку и Unity.

К сожалению, официально Nvidia настоятельно рекомендует перейти на GLSL и HLSL, поэтому CG доживает последние годы.

Metal

Относительно молодой язык шейдеров от компании Apple, который используют устройства начиная с iPhone 5S и iPad Air 2013. Был представлен в 2014 году и, по сути, мало чем отличается от описанных выше языков. Основное преимущество в скорости, благодаря уменьшению количества runtime-валидаций и реализации параллельных вычислений. Но больше это имиджевый ход для использования закрытых технологий в экосистеме. Вот пара ссылок, которые познакомят вас с Metal:

  1. Metal with Swift. О новом витке графики в Apple от Raywenderlich.
  2. Официальная спецификация от Apple.
  3. Увлекательная вводная статья на Хабре.

ARB

Единственный низкоуровневый представитель списка, да еще и родом из 20 века. На рубеже веков стал отраслевым стандартом для GPU, поддерживаемым широким спектром устройств. Впоследствии развитие пошло по двум направлениям:

  1. Общие реализации. Ограничена Pixel Shader 2.0, далее рекомендуется не лезть на низкий уровень и работать с GLSL, который, в свою очередь, компилируется в язык ассемблера.
  2. Nvidia-реализация. Увеличено число функций, ориентация на GPU компании.

Изучить язык ассемблера для графики можно, познакомившись со спецификацией. Остальное - дело техники и желания копаться в низкоуровневом коде.