понедельник, 6 июня 2011 г.

Новые материалы.

Теперь вариант с полной подготовкой материалов в оффлайне реализован. Всё исходит из того что у меня конечное и неизменное число источников света и явное разделение на объекты первого и заднего плана. Текстуры и параметры материала в рантайме менять нельзя, материалов как таковых в коде нет, есть только параметры задаваемые снаружи, такие как матрицы и источники света. Преимущества подхода: тривиально в рантайме, не нужно использовать свой класс моделей и материалов.

Реализация проста. Наследуется MaterialEffect и MaterialEffectContent, в ConvertMaterial ставится эффект с зашитыми в него параметрами и текстурами. У наследника появляется ровно одно поле - техника. Техника определяется по наличию текстур и параметров на меше, сохраняется в материал. При загрузке мы просто грузим MaterialEffect, текстуры и параметы уже получаются установленными. Потом ставим нужную технику. И на этом всё, далее достаточно использовать стандартный код для рисования, точно как с BasicEffect, только внешних параметров чуть больше.

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

Методику можно развить: сохранять не одну технику а кучу разных, в зависимости от типов и числа источников света, теней и прочих. В рантайме выбирать нужную исходя из внешних параметров, в эффекте при этом будет что то типа "параметры -> техника".

Комментариев нет: