Копируем “my_mr_shaders.mi” в папку: c:\Program Files\AUas\Maya7.0\mentalray\include\ А файл “my_ mr_shaders.dll” в папку: c:\Program Files\AUas\Maya7.0\mentalray\lib\ После чего нам потребуется отредактировать файл maya.rayrc, чтобы Maya знала, откуда грузить шейдер, для этого нужно добавить в него следующие строки:
link "{MAYABASE}/lib/my_mr_shaders. {DSO}"
mi " {MAYABASE} /include/my_mr_shaders. mi " Запускаем Maya.
Следует обратить внимание, что после загрузки Maya в Script Editor не должно быть никаких ошибок и предупреждений. Если все хорошо, то там должно быть что-то вроде:
// parsing C:/Program Files/Alias/Maya7.0/mentalray/include/oontoar.mi // generating Maya nodes…
// parsing Ci/Program Files/Alias/Maya7.0/mentalray/include/my_mr_shaders.mi // generating Maya nodes…
// parsing С: /Program Files/Alias/Maya7.0/mentalray/include/paint.mi // generating Maya nodes…
Это говорит о том, что mi файл написан правильно, и в нем нет синтаксических ошибок. Теперь посмотрим, что у нас получилось. Создаем любой объект, например, сферу, открываем Hypershade, жмем Create->mental ray Materials->My_constant и назначаем его на созданный объект и, затаив дыхание, жмем кнопку рейдер.
После того как рендер завершен, следует заглянуть в Output Window на предмет наличия ошибок и тп. Если таковые имеются, то следует проверить код или то, правильно ли установлен шейдер.
Теперь, когда мы имеем полностью рабочий шейдер, я расскажу немного о деталях кода.
typedef struct
{
miColor color;
}my_constant_t; Это структура параметров шейдера. Ее элементы должны совпадать с параметрами, указанными в mi файле, как по порядку, так и по количеству и типу данных. Название структуры можно использовать любое.
extern “C”
{
DLLEXPORT int my_constant_version(void) {return (1) ;}
DLLEXPORT miBoolean my_constant (miColor *result, miState *state, my_constant_t *paras)
{
*result = *mi_eval_color (Sparas->color) ; return (miTRUE) ;
}
.}............................................................................................................................................................................
Если вы пишите на C++, то вы должны использовать декларацию extern “c” для всех внешних функций, чтобы они могли линковаться с кодом, написанным на С. Без этого шейдер откомпилируется нормально, но не будет работать во время рендера. Если вы пишите свой код на С, то extern “С” использовать не требуется (как это, например примерах шейдеров идущих в стандартной поставке).
Далее мы видим две функции, которые являются обязательными для шейдера Первая, как видно из кода, просто возвращает версию шейдера. Версия должна быть та же, что указана в mi файле. Иначе во время рендера получим warning о несовпадении версий. Функция должна называться shadername_ version().
Вторая функция является главной функцией шейдера, по сути, это и есть сам шейдер. В качестве первого параметра в функцию передается miColor “result указатель на результат просчета шейдера.