diff options
Diffstat (limited to 'res/effectlib/funcspecularBSDF.glsllib')
-rw-r--r-- | res/effectlib/funcspecularBSDF.glsllib | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/res/effectlib/funcspecularBSDF.glsllib b/res/effectlib/funcspecularBSDF.glsllib new file mode 100644 index 0000000..e9450bf --- /dev/null +++ b/res/effectlib/funcspecularBSDF.glsllib @@ -0,0 +1,42 @@ +#include "luminance.glsllib" + +#ifndef scatter_reflect +#define scatter_reflect 0 +#define scatter_transmit 1 +#define scatter_reflect_transmit 2 +#endif + +vec4 specularBSDF(in vec3 N, in vec3 L, in vec3 viewDir, in vec3 lightSpecular, + in float ior, in float shininess, in vec3 tint, int mode) +{ + vec4 rgba = vec4( 0.0, 0.0, 0.0, 1.0 ); + float cosTheta = dot( N, L ); + if ( 0.0 < cosTheta ) + { + if ( ( mode == scatter_reflect ) || ( mode == scatter_reflect_transmit ) ) + { + vec3 R = reflect( -L, N ); + float cosAlpha = max( 0.0, dot( R, viewDir ) ); + float shine = pow( cosAlpha, shininess ); + rgba.rgb = shine * lightSpecular; + } + } + if ( ( mode == scatter_transmit ) || ( mode == scatter_reflect_transmit ) ) + { + // check against total reflection + vec3 R = refract( -viewDir, N, ior ); + if ( R == vec3( 0.0, 0.0, 0.0 ) ) + { + rgba.a = 1.0; + } + else if ( mode == scatter_transmit ) + { + rgba.a = 0.0; + } + else + { + rgba.a = 1.0 - luminance( tint ); + } + } + return( rgba ); +} |