diff options
author | Alexander Romanov <a.romanov@blend4web.com> | 2016-12-15 15:03:28 +0300 |
---|---|---|
committer | Alexander Romanov <a.romanov@blend4web.com> | 2016-12-15 15:03:28 +0300 |
commit | 12e1732f72bba6905da834a565885d4e8ecf9dc9 (patch) | |
tree | 6b73e6c83960365dcbe07b5a731660f655f6ee4d /source/blender/render | |
parent | 665110a4140307b2ae4c96f682e09c7e846101c4 (diff) |
Layer Weight node support for Blender Internal Render
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/extern/include/RE_shader_ext.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/include/shading.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeoutput.c | 21 |
3 files changed, 24 insertions, 1 deletions
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h index 73867de6b2e..ae389fdfd2e 100644 --- a/source/blender/render/extern/include/RE_shader_ext.h +++ b/source/blender/render/extern/include/RE_shader_ext.h @@ -218,6 +218,8 @@ int multitex_nodes(struct Tex *tex, float texvec[3], float dxt[3], float dyt[3], float RE_lamp_get_data(struct ShadeInput *shi, struct Object *lamp_obj, float col[4], float lv[3], float *dist, float shadow[4]); void RE_instance_get_particle_info(struct ObjectInstanceRen *obi, float *index, float *age, float *lifetime, float co[3], float *size, float vel[3], float angvel[3]); +float RE_fresnel_dielectric(float incoming[3], float normal[3], float eta); + /* shaded view and bake */ struct Render; struct Image; diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h index 27867eadbb4..13f16ce0bd7 100644 --- a/source/blender/render/intern/include/shading.h +++ b/source/blender/render/intern/include/shading.h @@ -99,7 +99,7 @@ ListBase *get_lights(struct ShadeInput *shi); float lamp_get_visibility(struct LampRen *lar, const float co[3], float lv[3], float *dist); void lamp_get_shadow(struct LampRen *lar, ShadeInput *shi, float inp, float shadfac[4], int do_real); -float fresnel_fac(const float view[3], const float vn[3], float fresnel, float fac); +float fresnel_fac(const float view[3], const float vn[3], float fresnel, float fac); /* rayshade.c */ extern void shade_ray(struct Isect *is, struct ShadeInput *shi, struct ShadeResult *shr); diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 3d6462e09a0..c4de95e863e 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -2151,3 +2151,24 @@ const float (*RE_render_current_get_matrix(int matrix_id))[4] } return NULL; } + +float RE_fresnel_dielectric(float incoming[3], float normal[3], float eta) +{ + /* compute fresnel reflectance without explicitly computing + * the refracted direction */ + float c = fabs(dot_v3v3(incoming, normal)); + float g = eta * eta - 1.0 + c * c; + float result; + + if (g > 0.0) { + g = sqrtf(g); + float A = (g - c) / (g + c); + float B = (c * (g + c) - 1.0) / (c * (g - c) + 1.0); + result = 0.5 * A * A * (1.0 + B * B); + } + else { + result = 1.0; /* TIR (no refracted component) */ + } + + return result; +}
\ No newline at end of file |