Прежде чем разбираться с материалами необходимо понять вообще что в них описывается и о чем идет речь. Лично для меня они в свое время были непонятны, поэтому начну разбираться с азов и рассказывать вам.
Начнем с понятия Shader. В файле Rvmat описывается два типа Shader-ов:
Pixel shaders: - пиксельные шедеры и Vertex shaders: вертексные шедеры - попробую объяснить что это за звери и с чем их едят
Пиксельные шейдеры - это программы, выполняемые видеочипом во время растеризации для каждого пикселя изображения, они производят выборку из текстур и/или математические операции над цветом и значением глубины (Z-buffer) пикселей. Все инструкции пиксельного шейдера выполняются попиксельно, после того, как операции с трансформированием и освещением геометрии завершены. Пиксельный шейдер в итоге своей работы выдает конечное значение цвета пикселя и Z-значение для последующего этапа графического конвейера, блендинга. Наиболее простой пример пиксельного шейдера, который можно привести: банальное мультитекстурирование, просто смешение двух текстур (diffuse и lightmap, например) и наложение результата вычисления на пиксель.
Вертексные шейдеры: Вершинные шейдеры - это программы, выполняемые видеочипами, которые производят математические операции с вершинами (vertex, из них состоят 3D объекты в играх), иначе говоря, они предоставляют возможность выполнять программируемые алгоритмы по изменению параметров вершин и их освещению (T&L - Transform & Lighting). Каждая вершина определяется несколькими переменными, например, положение вершины в 3D пространстве определяется координатами: x, y и z. Вершины также могут быть описаны характеристиками цвета, текстурными координатами и т.п. Вершинные шейдеры, в зависимости от алгоритмов, изменяют эти данные в процессе своей работы, например, вычисляя и записывая новые координаты и/или цвет. То есть, входные данные вершинного шейдера - данные об одной вершине геометрической модели, которая в данный момент обрабатывается. Обычно это координаты в пространстве, нормаль, компоненты цвета и текстурные координаты. Результирующие данные выполняемой программы служат входными для дальнейшей части конвейера, растеризатор делает линейную интерполяцию входных данных для поверхности треугольника и для каждого пикселя исполняет соответствующий пиксельный шейдер. Очень простой и грубый (но наглядный, надеюсь) пример: вершинный шейдер позволяет взять 3D объект сферы и вершинным шейдером сделать из него зеленый куб :). Примеры где можно применять такие шейдеры: Скининг (skinning). Matrix pallete skinning для скелетной анимации персонажей с большим количеством "костей. Деформация объектов. Как самый явный и эффектный пример - создание реалистичных волн в динамике. Анимация объектов. Например, травы и деревьев в одном из первых применений. Toon shading/Cel shading. Используется в некоторых играх для создания специального эффекта "мультяшного" изображения. Имитация ткани (Cloth Simulation) - для имитации поведения подобных ткани материалов.
Если резюмировать вышесказанное пиксельные шейдеры в большей степени отвечают за текстуру модели, а вертексные то, как будет выглядеть анимация и деформация модели, теней и тд.
Арма 3 предлагает возможность использовать в материалах следующие шейдеры:
Пиксельные:
sheder1.png 38.31KB 48 downloads
Вертексные:
sheder2.png 28.62KB 27 downloads
Каждый конкретный тип материала использует фиксированную комбинацию вершинного и пиксельного шейдеров с фиксированными номерами стадий и типом текстуры. Знания об этом можно получить только опытным путем, поэтому самая правильная рекомендации пользоваться темплейтами либо изучать .rvmat материалы на примерах доступных моделей BIS.
В файле rvmat шейдеры определяются в разделах
PixelShaderID = "....."; VertexShaderID = ".....";
Каждый из шейдеров использует специфический класс-этап Stage
class StageX
Каждый из "этапов" определяет параметры для расчета шейдера, обычно в виде ссылок на битовые карты эффектов.
texture = ...; // (имя и путь к эффекту bitmap текстуры). Filter = “Anisotropic”; //по умолчанию используется анизотропный фильтр (Anisotropic), но он может быть также Point,Linear,Trilinear
uvSource = “tex”; // данный параметр может быть - none, tex, tex1 (second UV set)
class uvTransform; // данный параметр определяет Смещение, деформацию или повторение текстуры в // заданном UV-наборе.