In this part I'll create the set range and blend functions that can be found in maya. These functions will be a set of auxilliary functions that I can call upon, much like how the set range and blend nodes work in Maya. Again, I am working from, Writing mental ray® Shaders: A Perceptual Introduction (mental ray® Handbooks). Buy the book, its worth it :)
I'll further refine the zdepth shader, incorporating the set range and blend functions.
Goal
1. Develop a Set Range function and use as a library function
2. Develop a Blender function and use as a library function
3. Apply the above functions into the zdepth shader
Before Starting
Make sure you are writing to a separate miaux.c and miaux.h file, in my case, i opened a new file called jc_miaux.c and had it compiled to an object (*.o) file. And put it in your include folder.
Library Header: jc_miaux
#include "shader.h" #ifndef __JC_MIAUX_H__ #define __JC_MIAUX_H__ double jc_miaux_set_range( double v, double oldmin, double oldmax, double newmin, double newmax); double jc_miaux_blend( miScalar a, miScalar b, miScalar factor); void jc_miaux_blend_colors( miColor *result, miColor *colorA, miColor *colorB, miScalar factor); #endif
Library C Source: jc_miaux
#include "jc_miaux.h" double jc_miaux_set_range( double v, double oldmin, double oldmax, double newmin, double newmax) { return newmin + ((v- oldmin) / (oldmax - oldmin)) * (newmax - newmin); } double jc_miaux_blend( miScalar a, miScalar b, miScalar factor) { return (a * factor) + (b * (1 - factor)); } void jc_miaux_blend_colors( miColor *result, miColor *colorA, miColor *colorB, miScalar factor) { result->r = jc_miaux_blend(colorA->r, colorB->r, factor); result->g = jc_miaux_blend(colorA->g, colorB->g, factor); result->b = jc_miaux_blend(colorA->b, colorB->b, factor); }
declare shader color "zdepth_ver3" ( scalar "near" default 0, scalar "far" default 1, color "near_color" default 1 1 1, color "far_color" default 0 0 0 ) apply material end declare
C Source: zdepth_ver3
#include "shader.h" #include "jc_miaux.h" struct zdepth_ver3 { miScalar near; miScalar far; miColor near_color; miColor far_color; }; DLLEXPORT miBoolean zdepth_ver3(miColor *result, miState *state, struct zdepth_ver3 *params) { miScalar near = *mi_eval_scalar(¶ms->near); miScalar far = *mi_eval_scalar(¶ms->far); miColor *near_color = mi_eval_color(¶ms->near_color); miColor *far_color = mi_eval_color(¶ms->far_color); miScalar factor; miVector position; mi_point_to_camera(state, &position, &state->point); factor = jc_miaux_set_range(position.z, far, near, 0, 1); result->r = (near_color->r * factor) + (far_color->r * (1 - factor)); result->g = (near_color->g * factor) + (far_color->g * (1 - factor)); result->b = (near_color->b * factor) + (far_color->b * (1 - factor)); result->a = 1; return miTRUE; }
Notes
0 comments:
Post a Comment