Intro
The previous simplest diffuse shader doesn't really take lights in the scene into account. To get that information, a shader parameter declaration of type "light" will be needed.
Mi Source
declare shader color "jc_simpler_diffuse" ( color "diffuse" default 0 0 0, light "onelight") version 1 apply material end declare
Notes:
The shader parameter declaration of type light is a string, so in the C sturct portion we'll use miTagC Source
#include "shader.h"
DLLEXPORT
struct jc_simpler_diffuse {
miColor diffuse;
miTag light;
};
DLLEXPORT
int jc_simpler_diffuse_version(void) {return(1);}
DLLEXPORT
miBoolean jc_simpler_diffuse(
miColor *result,
miState *state,
struct jc_simpler_diffuse *params) {
miColor light_color;
miVector dir;
miScalar dot_nl;
int samples;
miColor *diffuse = mi_eval_color(¶ms->diffuse);
miTag *light = mi_eval_tag(¶ms->light);
if(mi_sample_light(&light_color, &dir, &dot_nl, state, *light, &samples)) {
result->r = diffuse->r * dot_nl * light_color.r;
result->g = diffuse->g * dot_nl * light_color.g;
result->b = diffuse->b * dot_nl * light_color.b;
result->a = 1.0;
}
return(miTRUE);
}
Notes
the function mi_sample_light returns light_color, direction, and the dot_nl.Inside maya, the shader node has a text box that can create a light, or type in the light name. It only accepts a single light, thus, simpler diffuse shader. Regardless, its the first light based shader.

0 comments:
Post a Comment