i_l = *mi_eval_integer (¶s->i-light);
light = mi_eval_tag(paras->light) + i_l;
if (mode ==1)
mi_inclusive_lightlist(&n_l, slight, state);
else if (mode == 2)
mi_exclusive_lightlist (&n_l, slight, state);
for (n=0; n < n_l; n++, light++)
{
sum.r = sum.g = sum.b = 0; samples = 0;
while (mi_sample_light(&color, &dir, &dot_nl, state,
*light, &samples))
{
sum.r += dot nl * diff->r * color.r;
sum.g += dot_nl * diff->g *color.g;
sum.b += dot_nl * diff->b * color.b;
}
if (samples){
result->r += sum.r / samples;
result->g += sum.g / samples;
result->b += sum.b / samples;
}
}
result->a = 1; return (miTRUE);
}
.}.......................................................................................................................................................................
Подправим наш файл my_mr._shaders.mi, добавив туда следующие строки:
declare shader
color "my_lambert" (
color "diffuse", #: default 0.8 0.8 0.8
integer "mode",
array light "lights"
)
version 1 apply material #: nodeid 666056 end declare
Откомпилим и подключим шейдер, как было описано выше. В результате должен получиться обычный Iambert шейдер, код которого мы изучим дальше. По началу код может показаться непростым, но на самом деле все не так сложно. Рассмотрим его более подробно.
Рассмотрим код с самого верха - с описания структуры параметров шейдера. Всего шейдер имеет 3 параметра. Первый - ‘diffuse’ - это просто цвет поверхности. Далее идет ‘mode’. Он связан с третьим параметром и отвечает за линковку источников света влияет на то, какие источники света будут освещать шейдер. Третий параметр ‘light’ хранить массив источников света. В зависимости от параметра ‘mode’, источники света, указанные в массиве ‘light’, будут либо освещать, либо не освещать шейдер. Надо отметить, что для реализации массива требуется 3 переменных: ‘n_light’размер массива, то есть количество его элементов, ‘Might’ - индекс или смещение по массиву ‘light’
- тип элементов массива. Подробнее о реализации параметров шейдера типа массив можно прочитать в документации.
Далее, после создания нужных переменных и зачитывания параметров, идут функции, формирующие окончательный список источников света, которые влияют на шейдер.
if (mode == 1)
mi_inclusive_lightlist(&n_l, slight, state); else if (mode == 2)