@@ -106,21 +106,47 @@ float getFoam(in vec2 xz) {
106
106
107
107
vec2 dxdx_dzdz = dxdx_dzdz0 * croppinesses[0] + dxdx_dzdz1 * croppinesses[1] + dxdx_dzdz2 * croppinesses[2];
108
108
float dxdz = dxdz0 * croppinesses[0] + dxdz1 * croppinesses[1] + dxdz2 * croppinesses[2];
109
-
110
- return pow(-min(0.0f, det(jacobian(dxdx_dzdz.x, dxdz, dxdx_dzdz.y)) - foamSpreading), foamContrast);
109
+
110
+ float val = det(jacobian(dxdx_dzdz.x, dxdz, dxdx_dzdz.y));
111
+ return pow(-min(0.0f, val - foamSpreading), foamContrast);
112
+ }
113
+
114
+ vec3 surface(in vec3 normal, in vec3 view) {
115
+ const vec3 upwelling = vec3(0.0, 0.2, 0.3);
116
+ const vec3 sky = vec3(0.69, 0.84, 1.0);
117
+ const vec3 mist = vec3(0.34, 0.42, 0.5);
118
+ const float nShell = 1.34f;
119
+ const float kDiffuse = 0.91f;
120
+
121
+ float reflectivity;
122
+ float costhetai = abs(dot(normal, normalize(view)));
123
+ float thetai = acos(costhetai);
124
+ float sinthetat = sin(thetai) / nShell;
125
+ float thetat = asin(sinthetat);
126
+
127
+ if(thetai == 0.0)
128
+ {
129
+ reflectivity = (nShell - 1.0f) / (nShell + 1.0f);
130
+ reflectivity = reflectivity * reflectivity;
131
+ }
132
+ else
133
+ {
134
+ float fs = sin(thetat - thetai) / sin(thetat + thetai);
135
+ float ts = tan(thetat - thetai) / tan(thetat + thetai);
136
+ reflectivity = 0.5 * (fs * fs + ts * ts );
137
+ }
138
+
139
+ float falloff = exp(-length(view) * 1.0e-3) * kDiffuse;
140
+ vec3 surf = reflectivity * sky + (1.0f - reflectivity) * upwelling;
141
+ return falloff * surf + (1.0f - falloff) * mist;
111
142
}
112
143
113
144
void main()
114
145
{
115
- vec4 albedo = vec4(0, 0.62, 0.77, 1.0 );
146
+ float f = getFoam(_xz );
116
147
vec3 n = getNormal(_xz);
117
- vec3 l = normalize(pos - _position);
118
- float nol = dot(n, l) * 0.9 + 0.1;
119
- color = albedo * vec4(vec3(nol), 1.0f) + getFoam(_xz) * 0.5;
120
-
121
- if(!gl_FrontFacing) {
122
- color = vec4(1.0f);
123
- }
124
-
148
+ const vec3 foam = vec3(1.0f);
149
+ vec3 water = surface(n, pos - _position);
150
+ color = vec4(mix(water, foam, f), 1.0f);
125
151
}
126
152
` ;
0 commit comments