1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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 );
}
|