A shader that visualizes the world space, object space, and camera space normals.
Methodology
Same as in part I, but use a switch statement with different mi_vector_**** functions.
declare shader color "normals_as_colors_spaces" ( integer "spaces" default 1 ) apply material end declare
C File
#include "shader.h" struct normals_as_colors_spaces{ miInteger spaces; }; DLLEXPORT miBoolean normals_as_colors_spaces(miColor *result, miState *state, struct normals_as_colors_spaces *params) { miInteger spaces = *mi_eval_integer(¶ms->spaces); miVector normal; switch(spaces) { case 1: mi_vector_to_world(state, &normal, &state->normal); mi_vector_normalize(&normal); result->r = (normal.x + 1) / 2; result->g = (normal.y + 1) / 2; result->b = (normal.z + 1) / 2; result->a = 1.0; break; case 2: mi_vector_to_object(state, &normal, &state->normal); mi_vector_normalize(&normal); result->r = (normal.x + 1) / 2; result->g = (normal.y + 1) / 2; result->b = (normal.z + 1) / 2; result->a = 1.0; break; case 3: mi_vector_to_camera(state, &normal, &state->normal); mi_vector_normalize(&normal); result->r = (normal.x + 1) / 2; result->g = (normal.y + 1) / 2; result->b = (normal.z + 1) / 2; result->a = 1.0; break; default : result->r = (state->normal.x + 1) / 2; result->g = (state->normal.y + 1) / 2; result->b = (state->normal.z + 1) / 2; result->a = 1.0; }; return miTRUE; }
Notes
Viewport & Hypershade |
Render |
From left to right, world space, object space, camera space, default internal space. All the spheres are rotated 45 degrees on the Y-axis. It would be clearer to look at each individual color separetly.
0 comments:
Post a Comment