-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfrag.glsl
158 lines (142 loc) · 5.19 KB
/
frag.glsl
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
#version 330
// Input vertex attributes (from vertex shader)
in vec2 fragTexCoord;
in vec4 fragColor;
in vec3 fragPosition;
in vec3 fragPositionWorld;
in vec3 fragNormal;
in vec3 rayDir;
uniform mat4 mvp;
uniform vec4 colDiffuse;
// Output fragment color
out vec4 finalColor;
#define fbm_steps 6
#define wall_height 5.0
#define outer_wall_height 10.0
#define sky_extents 1000.0
#define PI 3.14159265359
vec4 gray(float color) {
return vec4(color, color, color, 1.0);
}
float rand(vec2 co) {
return fract(sin(dot(co, vec2(839.27, -312.39))) * 21890.29);
}
float value_noise(vec2 co) {
vec2 base = floor(co);
float ul = rand(base);
float ur = rand(base + vec2(1.0, 0.0));
float ll = rand(base + vec2(0.0, 1.0));
float lr = rand(base + vec2(1.0, 1.0));
float u = mix(ul, ur, fract(co.x));
float l = mix(ll, lr, fract(co.x));
return mix(u, l, fract(co.y));
}
float rand_3d(vec3 co) {
return fract(sin(dot(co, vec3(839.27, -312.39, 895.12))) * 21890.29);
}
float value_noise_3d(vec3 co) {
vec3 base = floor(co);
float ulb = rand_3d(base);
float ulf = rand_3d(base + vec3(1.0, 0.0, 0.0));
float urb = rand_3d(base + vec3(0.0, 1.0, 0.0));
float urf = rand_3d(base + vec3(1.0, 1.0, 0.0));
float llb = rand_3d(base + vec3(0.0, 0.0, 1.0));
float llf = rand_3d(base + vec3(1.0, 0.0, 1.0));
float lrb = rand_3d(base + vec3(0.0, 1.0, 1.0));
float lrf = rand_3d(base + vec3(1.0, 1.0, 1.0));
float ul = mix(ulb, ulf, fract(co.x));
float ur = mix(urb, urf, fract(co.x));
float ll = mix(llb, llf, fract(co.x));
float lr = mix(lrb, lrf, fract(co.x));
float u = mix(ul, ur, fract(co.y));
float l = mix(ll, lr, fract(co.y));
return mix(u, l, fract(co.z));
}
float fbm(vec2 st) {
vec2 coord = st;
float value = 0.0;
float amp_mul = 0.5;
float amplitude = 1.0 - amp_mul;
float frequency = 1.0;
vec2 offset = vec2(0.312, -0.732);
float angle = 0.13;
// mat2 rotation = mat2(cos(angle), sin(angle), -sin(angle), cos(angle));
for (int i = 0; i < fbm_steps; i++) {
value += amplitude * value_noise(coord * frequency);
coord += offset;
// coord = rotation * coord;
frequency *= 2.0;
amplitude *= amp_mul;
}
return value;
}
float fbm_3d(vec3 st) {
vec3 coord = st;
float value = 0.0;
float amp_mul = 0.5;
float amplitude = 1.0 - amp_mul;
float frequency = 1.0;
// vec3 offset = vec3(0.312, -0.732, 0.183);
vec3 offset = vec3(-0.732, 0.312, 0.183);
float angle = 0.13;
// mat2 rotation = mat2(cos(angle), sin(angle), -sin(angle), cos(angle));
for (int i = 0; i < fbm_steps; i++) {
value += amplitude * value_noise_3d(coord * frequency);
coord += offset;
// coord = rotation * coord;
// coord.xz = rotation * coord.xz;
// coord.xy = rotation * coord.xy;
frequency *= 2.0;
amplitude *= amp_mul;
}
return value;
}
mat2 rot_matrix(float angle) {
return mat2(cos(angle), sin(angle), -sin(angle), cos(angle));
}
vec3 darkGreen = vec3(0.1, 0.2, 0.1) / 0.5;
vec3 slightlyLighterGreen = vec3(0.2, 0.3, 0.2) / 0.5;
// vec3 darkBrown = vec3(0.2, 0.1, 0.0) / 0.6;
vec3 darkBrown = vec3(0.2, 0.1, 0.1) / 0.6;
// vec3 brown = vec3(0.35, 0.25, 0.1) / 0.6;
vec3 brown = vec3(0.35, 0.25, 0.3) / 0.6;
vec3 darkestBrown = darkBrown * (darkBrown / brown);
void main() {
if (colDiffuse.r == 0.0 && colDiffuse.g == 1.0 && colDiffuse.b == 1.0) {
// finalColor = gray(fragPositionWorld.y / 70.0 + 0.1);
float height = fragPositionWorld.y / wall_height;
finalColor = vec4(mix(darkBrown, brown, sqrt(height)), 1.0);
} else if (fragColor.r == 0.0 && fragColor.g == 1.0 && fragColor.b == 0.0) {
// float noiseValue = fbm(fragPositionWorld.xz * 0.2);
// vec3 color = mix(darkestBrown, darkBrown, noiseValue);
vec3 color = darkBrown;
finalColor = vec4(color, 1.0);
} else if (colDiffuse.r == 1.0 && colDiffuse.g == 1.0 && colDiffuse.b == 0.0) {
float height = fragPositionWorld.y / outer_wall_height;
finalColor = vec4(mix(darkBrown, brown, height), 1.0);
} else if (colDiffuse.r == 0.0 && colDiffuse.g == 0.0 && colDiffuse.b == 1.0) {
vec3 skyDir = fragPositionWorld / (sky_extents / 200.0);
vec3 resultColor = vec3(0.0);
float star_thresh = 0.7;
// float col_range = PI / 2;
float col_range = PI / 6;
float col_shift = 0;
float color_div = 4.0;
for (int i = 0; i < 3; i++) {
float noiseValue = fbm_3d(skyDir);
float grays = max(0.0, noiseValue - star_thresh) * 10;
float color = max(0.0, noiseValue - star_thresh + 0.01) * 10;
vec3 starColor = vec3(0.0, 0.0, 1.0);
starColor.xz = rot_matrix(col_shift-fbm_3d(skyDir.xzy / color_div) * col_range) * starColor.xz;
// resultColor += gray(grays).rgb + color * starColor;
resultColor = max(resultColor, gray(grays).rgb + color * starColor);
skyDir /= sqrt(30.0);
star_thresh -= 0.05;
col_range *= 2;
color_div /= 2.0;
}
finalColor = vec4(resultColor, 1.0);
} else {
finalColor = fragColor;
}
}