diff options
author | Ton Roosendaal <ton@blender.org> | 2005-12-04 23:43:41 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-12-04 23:43:41 +0300 |
commit | dd1f6c649a42258c71a2234eeede0b16b3ef245f (patch) | |
tree | d4f1ebf816bcd4bdc9e86e424d1064bf55060b5e | |
parent | 386ac3877a83cb19f5c4134bd108afc93f6f994c (diff) |
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.
-rw-r--r-- | source/blender/blenkernel/BKE_bad_level_calls.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/bad_level_call_stubs/stubs.c | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_material_types.h | 1 | ||||
-rw-r--r-- | source/blender/render/extern/include/render.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 41 | ||||
-rw-r--r-- | source/blender/src/buttons_shading.c | 6 | ||||
-rw-r--r-- | source/blender/src/previewrender.c | 1 |
9 files changed, 35 insertions, 20 deletions
diff --git a/source/blender/blenkernel/BKE_bad_level_calls.h b/source/blender/blenkernel/BKE_bad_level_calls.h index a8d9693f62f..8a86e88406f 100644 --- a/source/blender/blenkernel/BKE_bad_level_calls.h +++ b/source/blender/blenkernel/BKE_bad_level_calls.h @@ -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); diff --git a/source/blender/blenkernel/bad_level_call_stubs/stubs.c b/source/blender/blenkernel/bad_level_call_stubs/stubs.c index 778cb71f99a..98ecc32ee3f 100644 --- a/source/blender/blenkernel/bad_level_call_stubs/stubs.c +++ b/source/blender/blenkernel/bad_level_call_stubs/stubs.c @@ -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){} diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index b143def9f32..f7cf3d6d931 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -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; diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index ef5a29020d4..c9c1b4fa98d 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -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) diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 395c438c6e3..3f74370ac1f 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -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 diff --git a/source/blender/render/extern/include/render.h b/source/blender/render/extern/include/render.h index abde461a935..ec724b55846 100644 --- a/source/blender/render/extern/include/render.h +++ b/source/blender/render/extern/include/render.h @@ -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); diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 28eca24856e..8b6c4118786 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -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 } diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index b6f600118de..3b31009858f 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -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 */ diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c index 759baa72e5c..8604219387f 100644 --- a/source/blender/src/previewrender.c +++ b/source/blender/src/previewrender.c @@ -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); |