00001 #ifndef _FRESNEL_HPP_
00002 #define _FRESNEL_HPP_
00003
00004 #include <crbn/basic/scalar.hpp>
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 inline float FresnelPerpendicularReflect(const float& n1, const float& cos_alpha,
00022 const float& n2, const float& cos_beta ) {
00023 return ((n1 * cos_alpha) - (n2 * cos_beta)) / ((n1 * cos_alpha) + (n2 * cos_beta));
00024 }
00025
00026
00027
00028
00029 inline float FresnelParallelReflect(const float& n1, const float& cos_alpha,
00030 const float& n2, const float& cos_beta ) {
00031 return ((n2 * cos_alpha) - (n1 * cos_beta)) / ((n1 * cos_beta) + (n2 * cos_alpha));
00032 }
00033
00034
00035
00036
00037 inline float FresnelPerpendicularTransmit(const float& n1, const float& cos_alpha,
00038 const float& n2, const float& cos_beta ) {
00039 return (2.0 * n1 * cos_alpha) / ((n1 * cos_alpha) + (n2 * cos_beta));
00040 }
00041
00042
00043
00044
00045 inline float FresnelParallelTransmit(const float& n1, const float& cos_alpha,
00046 const float& n2, const float& cos_beta ) {
00047 return (2.0 * n1 * cos_alpha) / ((n1 * cos_beta) + (n2 * cos_alpha));
00048 }
00049
00050
00051
00052 inline float Reflected(const float& n1, const float& cos_alpha,
00053 const float& n2, const float& cos_beta ) {
00054 float parallel = FresnelParallelReflect(n1, cos_alpha, n2, cos_beta);
00055 float perpendicular = FresnelPerpendicularReflect(n1, cos_alpha, n2, cos_beta);
00056 return 0.5 * (sqr(parallel) + sqr(perpendicular));
00057 }
00058
00059
00060 inline float Transmitted(const float& n1, const float& cos_alpha,
00061 const float& n2, const float& cos_beta ) {
00062 float parallel = FresnelParallelTransmit(n1, cos_alpha, n2, cos_beta);
00063 float perpendicular = FresnelPerpendicularTransmit(n1, cos_alpha, n2, cos_beta);
00064
00065 return ((n2 * cos_beta) / (n1 * cos_alpha)) * 0.5 * (sqr(parallel) + sqr(perpendicular));
00066 }
00067
00068 #endif