-
Notifications
You must be signed in to change notification settings - Fork 0
/
default.frag
164 lines (129 loc) · 4.8 KB
/
default.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#version 330 core
// Outputs colors in RGBA
out vec4 FragColor;
// Imports the current position from the Vertex Shader
in vec3 crntPos;
// Imports the normal from the Vertex Shader
in vec3 Normal;
// Imports the color from the Vertex Shader
in vec3 color;
// Imports the texture coordinates from the Vertex Shader
in vec2 texCoord;
// Gets the position of the light from the main function
in vec3 lightPos;
// Gets the position of the camera from the main function
in vec3 camPos;
// Gets the Texture Units from the main function
uniform sampler2D diffuse0;
uniform sampler2D specular0;
uniform sampler2D normal0;
uniform sampler2D displacement0;
// Gets the color of the light from the main function
uniform vec4 lightColor;
vec4 pointLight()
{
// used in two variables so I calculate it here to not have to do it twice
vec3 lightVec = lightPos - crntPos;
// intensity of light with respect to distance
float dist = length(lightVec);
float a = 1.00f;
float b = 0.70f;
float inten = 1.0f / (a * dist * dist + b * dist + 1.0f);
// ambient lighting
float ambient = 0.05f;
vec3 viewDirection = normalize(camPos - crntPos);
// Variables that control parallax occlusion mapping quality
float heightScale = 0.05f;
const float minLayers = 8.0f;
const float maxLayers = 64.0f;
float numLayers = mix(maxLayers, minLayers, abs(dot(vec3(0.0f, 0.0f, 1.0f), viewDirection)));
float layerDepth = 1.0f / numLayers;
float currentLayerDepth = 0.0f;
// Remove the z division if you want less aberated results
vec2 S = viewDirection.xy / viewDirection.z * heightScale;
vec2 deltaUVs = S / numLayers;
vec2 UVs = texCoord;
float currentDepthMapValue = 1.0f - texture(displacement0, UVs).r;
// Loop till the point on the heightmap is "hit"
while(currentLayerDepth < currentDepthMapValue)
{
UVs -= deltaUVs;
currentDepthMapValue = 1.0f - texture(displacement0, UVs).r;
currentLayerDepth += layerDepth;
}
// Apply Occlusion (interpolation with prev value)
vec2 prevTexCoords = UVs + deltaUVs;
float afterDepth = currentDepthMapValue - currentLayerDepth;
float beforeDepth = 1.0f - texture(displacement0, prevTexCoords).r - currentLayerDepth + layerDepth;
float weight = afterDepth / (afterDepth - beforeDepth);
UVs = prevTexCoords * weight + UVs * (1.0f - weight);
// Get rid of anything outside the normal range
if(UVs.x > 1.0 || UVs.y > 1.0 || UVs.x < 0.0 || UVs.y < 0.0)
discard;
// diffuse lighting
// Normals are mapped from the range [0, 1] to the range [-1, 1]
vec3 normal = normalize(texture(normal0, UVs).xyz * 2.0f - 1.0f);
vec3 lightDirection = normalize(lightVec);
float diffuse = max(dot(normal, lightDirection), 0.0f);
// specular lighting
float specular = 0.0f;
if (diffuse != 0.0f)
{
float specularLight = 0.50f;
vec3 halfwayVec = normalize(viewDirection + lightDirection);
float specAmount = pow(max(dot(normal, halfwayVec), 0.0f), 16);
specular = specAmount * specularLight;
};
return (texture(diffuse0, UVs) * (diffuse * inten + ambient) + texture(specular0, UVs).r * specular * inten) * lightColor;
}
vec4 direcLight()
{
// ambient lighting
float ambient = 0.20f;
// diffuse lighting
vec3 normal = normalize(Normal);
vec3 lightDirection = normalize(vec3(1.0f, 1.0f, 0.0f));
float diffuse = max(dot(normal, lightDirection), 0.0f);
// specular lighting
float specular = 0.0f;
if (diffuse != 0.0f)
{
float specularLight = 0.50f;
vec3 viewDirection = normalize(camPos - crntPos);
vec3 halfwayVec = normalize(viewDirection + lightDirection);
float specAmount = pow(max(dot(normal, halfwayVec), 0.0f), 16);
specular = specAmount * specularLight;
};
return (texture(diffuse0, texCoord) * (diffuse + ambient) + texture(specular0, texCoord).r * specular) * lightColor;
}
vec4 spotLight()
{
// controls how big the area that is lit up is
float outerCone = 0.90f;
float innerCone = 0.95f;
// ambient lighting
float ambient = 0.20f;
// diffuse lighting
vec3 normal = normalize(Normal);
vec3 lightDirection = normalize(lightPos - crntPos);
float diffuse = max(dot(normal, lightDirection), 0.0f);
// specular lighting
float specular = 0.0f;
if (diffuse != 0.0f)
{
float specularLight = 0.50f;
vec3 viewDirection = normalize(camPos - crntPos);
vec3 halfwayVec = normalize(viewDirection + lightDirection);
float specAmount = pow(max(dot(normal, halfwayVec), 0.0f), 16);
specular = specAmount * specularLight;
};
// calculates the intensity of the crntPos based on its angle to the center of the light cone
float angle = dot(vec3(0.0f, -1.0f, 0.0f), -lightDirection);
float inten = clamp((angle - outerCone) / (innerCone - outerCone), 0.0f, 1.0f);
return (texture(diffuse0, texCoord) * (diffuse * inten + ambient) + texture(specular0, texCoord).r * specular * inten) * lightColor;
}
void main()
{
// outputs final color
FragColor = pointLight();
}