-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
base.frag
88 lines (72 loc) · 2.21 KB
/
base.frag
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Compiler should remove unneeded stuff
uniform vec3 view_position;
uniform vec3 light_globalAmbient;
varying vec3 vPositionW;
varying vec3 vNormalW;
varying vec3 vTangentW;
varying vec3 vBinormalW;
varying vec2 vUv0;
varying vec2 vUv1;
//varying vec4 vVertexColor;
varying vec3 vNormalV;
varying vec4 vMainShadowUv;
struct psInternalData {
vec3 albedo;
vec3 specularity;
float glossiness;
vec3 emission;
vec3 normalW;
mat3 TBN;
vec3 viewDirW;
vec3 reflDirW;
vec3 diffuseLight;
vec3 specularLight;
vec4 reflection;
float alpha;
vec3 lightDirNormW;
vec3 lightDirW;
vec3 lightPosW;
float atten;
vec3 shadowCoord;
vec2 uvOffset;
vec3 normalMap;
float ao;
};
void getViewDir(inout psInternalData data) {
data.viewDirW = normalize(view_position - vPositionW);
}
void getReflDir(inout psInternalData data) {
data.reflDirW = normalize(-reflect(data.viewDirW, data.normalW));
}
void getLightDirPoint(inout psInternalData data, vec3 lightPosW) {
data.lightDirW = vPositionW - lightPosW;
data.lightDirNormW = normalize(data.lightDirW);
data.lightPosW = lightPosW;
}
float getFalloffLinear(inout psInternalData data, float lightRadius) {
float d = length(data.lightDirW);
return max(((lightRadius - d) / lightRadius), 0.0);
}
float square(float x) {
return x*x;
}
float saturate(float x) {
return clamp(x, 0.0, 1.0);
}
float getFalloffInvSquared(inout psInternalData data, float lightRadius) {
float sqrDist = dot(data.lightDirW, data.lightDirW);
float falloff = 1.0 / (sqrDist + 1.0);
float invRadius = 1.0 / lightRadius;
falloff *= 16.0;
falloff *= square( saturate( 1.0 - square( sqrDist * square(invRadius) ) ) );
return falloff;
}
float getSpotEffect(inout psInternalData data, vec3 lightSpotDirW, float lightInnerConeAngle, float lightOuterConeAngle) {
float cosAngle = dot(data.lightDirNormW, lightSpotDirW);
return smoothstep(lightOuterConeAngle, lightInnerConeAngle, cosAngle);
}
void processMetalness(inout psInternalData data, float metalness) {
const float dielectricF0 = 0.04;
data.specularity = mix(vec3(dielectricF0), data.albedo, metalness);
data.albedo *= 1.0 - metalness;
}