Orange bramch:

New diffuse shader, "Fresnel", which using existing fresnel formula.
Since it hilights edges (away from lamp), nice to fill darker parts with
the new layering system.

Weird stuff though;
http://www.blender.org/bf/0001_0040.avi
(Movie disappears in a couple of days!)

Note; for ray-shadow you need to use the Bias, to prevent 'terminator'
problems. I made that option default now.
This commit is contained in:
Ton Roosendaal
2005-12-04 20:43:41 +00:00
parent 386ac3877a
commit dd1f6c649a
9 changed files with 35 additions and 20 deletions

View File

@@ -88,6 +88,7 @@ float WardIso_Spec(float *n, float *l, float *v, float a, int);
float Toon_Diff(float *n, float *l, float *v, float a, float b);
float OrenNayar_Diff(float *n, float *l, float *v, float rough);
float Minnaert_Diff(float nl, float *n, float *v, float a);
float Fresnel_Diff(float *vn, float *lv, float *view, float ior, float fac);
void add_to_diffuse(float *, ShadeInput *, float, float, float, float);
void ramp_diffuse_result(float *diff, ShadeInput *shi);

View File

@@ -116,6 +116,7 @@ float WardIso_Spec(float *n, float *l, float *v, float a, int tangent){return 0;
float Toon_Diff(float *n, float *l, float *v, float a, float b){return 0;}
float OrenNayar_Diff(float *n, float *l, float *v, float rough){return 0;}
float Minnaert_Diff(float nl, float *n, float *v, float a){return 0;}
float Fresnel_Diff(float *vn, float *lv, float *view, float ior, float fac){return 0;}
void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, float b){}
void ramp_diffuse_result(float *diff, ShadeInput *shi){}

View File

@@ -537,6 +537,7 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
if(ma->diff_shader==MA_DIFF_ORENNAYAR) is= OrenNayar_Diff(nor, lv, shi.view, ma->roughness);
else if(ma->diff_shader==MA_DIFF_TOON) is= Toon_Diff(nor, lv, shi.view, ma->param[0], ma->param[1]);
else if(ma->diff_shader==MA_DIFF_MINNAERT) is= Minnaert_Diff(is, nor, shi.view, ma->darkness);
else if(ma->diff_shader==MA_DIFF_FRESNEL) is= Fresnel_Diff(nor, lv, shi.view, ma->param[0], ma->param[1]);
}
back= 0;

View File

@@ -124,7 +124,7 @@ void init_material(Material *ma)
ma->pr_lamp= 3; /* two lamps, is bits */
ma->ml_flag= ML_RENDER; /* default render base material for layers */
ma->mode= MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RADIO|MA_TANGENT_STR;
ma->mode= MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RADIO|MA_RAYBIAS|MA_TANGENT_STR;
}
Material *add_material(char *name)

View File

@@ -173,6 +173,7 @@ typedef struct Material {
#define MA_DIFF_ORENNAYAR 1
#define MA_DIFF_TOON 2
#define MA_DIFF_MINNAERT 3
#define MA_DIFF_FRESNEL 4
/* spec_shader */
#define MA_SPEC_COOKTORR 0

View File

@@ -182,6 +182,7 @@ float WardIso_Spec(float *n, float *l, float *v, float rms, int tangent);
float OrenNayar_Diff(float *n, float *l, float *v, float rough);
float Toon_Diff( float *n, float *l, float *v, float size, float smooth);
float Minnaert_Diff( float nl, float *n, float *v, float darkness);
float Fresnel_Diff(float *vn, float *lv, float *view, float ior, float fac);
void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, float b);
void ramp_diffuse_result(float *diff, ShadeInput *shi);

View File

@@ -649,6 +649,23 @@ static double Normalise_d(double *n)
return d;
}
/* mix of 'real' fresnel and allowing control. grad defines blending gradient */
float fresnel_fac(float *view, float *vn, float grad, float fac)
{
float t1, t2;
if(fac==0.0) return 1.0;
t1= (view[0]*vn[0] + view[1]*vn[1] + view[2]*vn[2]);
if(t1>0.0) t2= 1.0+t1;
else t2= 1.0-t1;
t2= grad + (1.0-grad)*pow(t2, fac);
if(t2<0.0) return 0.0;
else if(t2>1.0) return 1.0;
return t2;
}
static double saacos_d(double fac)
{
@@ -1010,6 +1027,11 @@ float Minnaert_Diff(float nl, float *n, float *v, float darkness)
return i;
}
float Fresnel_Diff(float *vn, float *lv, float *view, float fac_i, float fac)
{
return fresnel_fac(lv, vn, fac_i, fac);
}
/* --------------------------------------------- */
/* also called from texture.c */
void calc_R_ref(ShadeInput *shi)
@@ -1059,24 +1081,6 @@ void calc_R_ref(ShadeInput *shi)
}
/* mix of 'real' fresnel and allowing control. grad defines blending gradient */
float fresnel_fac(float *view, float *vn, float grad, float fac)
{
float t1, t2;
if(fac==0.0) return 1.0;
t1= (view[0]*vn[0] + view[1]*vn[1] + view[2]*vn[2]);
if(t1>0.0) t2= 1.0+t1;
else t2= 1.0-t1;
t2= grad + (1.0-grad)*pow(t2, fac);
if(t2<0.0) return 0.0;
else if(t2>1.0) return 1.0;
return t2;
}
void shade_color(ShadeInput *shi, ShadeResult *shr)
{
Material *ma= shi->mat;
@@ -1657,6 +1661,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if(ma->diff_shader==MA_DIFF_ORENNAYAR) is= OrenNayar_Diff_i(inp, vn, lv, view, ma->roughness);
else if(ma->diff_shader==MA_DIFF_TOON) is= Toon_Diff(vn, lv, view, ma->param[0], ma->param[1]);
else if(ma->diff_shader==MA_DIFF_MINNAERT) is= Minnaert_Diff(inp, vn, view, ma->darkness);
else if(ma->diff_shader==MA_DIFF_FRESNEL) is= Fresnel_Diff(vn, lv, view, ma->param[0], ma->param[1]);
else is= inp; // Lambert
}

View File

@@ -3125,7 +3125,7 @@ static void material_panel_shading(Material *ma)
uiBlockEndAlign(block);
}
else {
char *str1= "Diffuse Shader%t|Lambert %x0|Oren-Nayar %x1|Toon %x2|Minnaert %x3";
char *str1= "Diffuse Shader%t|Lambert %x0|Oren-Nayar %x1|Toon %x2|Minnaert %x3|Fresnel %x4";
char *str2= "Specular Shader%t|CookTorr %x0|Phong %x1|Blinn %x2|Toon %x3|WardIso %x4";
/* diff shader buttons */
@@ -3141,6 +3141,10 @@ static void material_panel_shading(Material *ma)
}
else if(ma->diff_shader==MA_DIFF_MINNAERT)
uiDefButF(block, NUMSLI, B_MATPRV, "Dark:",90,160, 150,19, &(ma->darkness), 0.0, 2.0, 0, 0, "Sets Minnaert darkness");
else if(ma->diff_shader==MA_DIFF_FRESNEL) {
uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel:", 90, 160,150,19, &(ma->param[1]), 0.0, 5.0, 0, 0, "Power of Fresnel");
uiDefButF(block, NUMSLI, B_MATPRV, "Fac:",90,140,150,19, &(ma->param[0]), 1.0, 5.0, 0, 0, "Blending factor");
}
uiBlockEndAlign(block);
/* spec shader buttons */

View File

@@ -818,6 +818,7 @@ static void shade_lamp_loop_preview(ShadeInput *shi, ShadeResult *shr, int pr_la
if(mat->diff_shader==MA_DIFF_ORENNAYAR) is= OrenNayar_Diff(shi->vn, lv, shi->view, mat->roughness);
else if(mat->diff_shader==MA_DIFF_TOON) is= Toon_Diff(shi->vn, lv, shi->view, mat->param[0], mat->param[1]);
else if(mat->diff_shader==MA_DIFF_MINNAERT) is= Minnaert_Diff(is, shi->vn, shi->view, mat->darkness);
else if(mat->diff_shader==MA_DIFF_FRESNEL) is= Fresnel_Diff(shi->vn, lv, shi->view, mat->param[0], mat->param[1]);
// else Lambert
inp= (shi->refl*is + shi->emit);