|
|
@@ -3,7 +3,6 @@ import * as THREE from 'three'
|
|
|
const lakeVertexShader = `
|
|
|
uniform float iTime;
|
|
|
uniform float waveHeight;
|
|
|
-uniform float waveFrequency;
|
|
|
uniform float flowSpeed;
|
|
|
uniform vec2 flowDirection;
|
|
|
|
|
|
@@ -23,7 +22,7 @@ void main() {
|
|
|
float time = iTime * 0.5;
|
|
|
|
|
|
vec4 worldPos = modelMatrix * vec4(position, 1.0);
|
|
|
- vec2 wavePos = worldPos.xz * waveFrequency;
|
|
|
+ vec2 wavePos = worldPos.xz;
|
|
|
|
|
|
float h = 0.0;
|
|
|
h += calcVertexWave(wavePos, time, flowDir, 1.00, 1.0, 1.20 * flowSpeed);
|
|
|
@@ -54,7 +53,6 @@ uniform float cameraNear;
|
|
|
uniform float cameraFar;
|
|
|
uniform float waterLevel;
|
|
|
uniform float waveHeight;
|
|
|
-uniform float waveFrequency;
|
|
|
uniform float flowSpeed;
|
|
|
uniform vec3 shallowColor;
|
|
|
uniform vec3 deepColor;
|
|
|
@@ -144,26 +142,7 @@ void computeWaves(out Wave waves[NUM_WAVES]) {
|
|
|
waves[7] = Wave(normalize(mainDir + vec2(0.3, 0.5)),0.05, 10.5, 4.50, 0.05);
|
|
|
}
|
|
|
|
|
|
-float calcWaveHeight(vec2 pos, float time, Wave w) {
|
|
|
- return w.amp * sin(dot(pos, w.dir) * w.freq + time * w.speed);
|
|
|
-}
|
|
|
-
|
|
|
-vec2 calcWaveDerivative(vec2 pos, float time, Wave w) {
|
|
|
- float cosVal = cos(dot(pos, w.dir) * w.freq + time * w.speed);
|
|
|
- return w.amp * w.freq * w.dir * cosVal;
|
|
|
-}
|
|
|
-
|
|
|
-float totalWaveHeight(vec2 pos, float time, float wh, float wf) {
|
|
|
- Wave waves[NUM_WAVES];
|
|
|
- computeWaves(waves);
|
|
|
- float h = 0.0;
|
|
|
- for (int i = 0; i < NUM_WAVES; i++) {
|
|
|
- h += calcWaveHeight(pos * wf, time, waves[i]);
|
|
|
- }
|
|
|
- return h * wh;
|
|
|
-}
|
|
|
-
|
|
|
-void computeWaveData(vec2 pos, float time, float wh, float wf, out float height, out vec3 normal, out vec2 displacement) {
|
|
|
+void computeWaveData(vec2 pos, float time, float wh, float wf, out float height, out vec2 displacement) {
|
|
|
Wave waves[NUM_WAVES];
|
|
|
computeWaves(waves);
|
|
|
|
|
|
@@ -183,17 +162,6 @@ void computeWaveData(vec2 pos, float time, float wh, float wf, out float height,
|
|
|
height *= wh;
|
|
|
deriv *= wh;
|
|
|
displacement = disp * wh * 0.3;
|
|
|
-
|
|
|
- vec3 n = normalize(vec3(-deriv.x, 1.0, -deriv.y));
|
|
|
- normal = n;
|
|
|
-}
|
|
|
-
|
|
|
-float eddyNoise(vec2 pos, float time) {
|
|
|
- vec2 p = pos * 0.8 + time * 0.08;
|
|
|
- float n1 = noise(p);
|
|
|
- float n2 = noise(p * 2.3 + 1.7);
|
|
|
- float n3 = noise(p * 4.7 + 3.2);
|
|
|
- return (n1 * 0.6 + n2 * 0.3 + n3 * 0.1);
|
|
|
}
|
|
|
|
|
|
float getCollisionFoam(vec2 pos, float depthDiff) {
|
|
|
@@ -225,34 +193,16 @@ void main() {
|
|
|
vec2 flowDir = normalize(flowDirection);
|
|
|
float time = iTime * 0.5;
|
|
|
|
|
|
- vec2 wavePos = vWorldPosition.xz * waveFrequency;
|
|
|
+ vec2 wavePos = vWorldPosition.xz;
|
|
|
|
|
|
float waveH;
|
|
|
- vec3 waveN;
|
|
|
vec2 waveDisp;
|
|
|
- computeWaveData(wavePos, time, waveHeight * 0.2, waveFrequency, waveH, waveN, waveDisp);
|
|
|
-
|
|
|
- vec2 displacedPos = wavePos + waveDisp * 0.3;
|
|
|
-
|
|
|
- float choppyH;
|
|
|
- vec3 choppyN;
|
|
|
- vec2 choppyDisp;
|
|
|
- computeWaveData(displacedPos, time, waveHeight * 0.15, waveFrequency * 1.3, choppyH, choppyN, choppyDisp);
|
|
|
-
|
|
|
- vec3 finalNormal = normalize(waveN + choppyN * 0.4);
|
|
|
-
|
|
|
- float eddy = eddyNoise(vWorldPosition.xz, time);
|
|
|
- float eddyAngle = eddy * 4.0 - 2.0;
|
|
|
- vec2 eddyDir = vec2(cos(eddyAngle), sin(eddyAngle));
|
|
|
- vec3 eddyNormal = normalize(vec3(eddyDir.x * 0.08, 1.0, eddyDir.y * 0.08));
|
|
|
-
|
|
|
- finalNormal = normalize(finalNormal + eddyNormal * 0.15);
|
|
|
+ computeWaveData(wavePos, time, waveHeight * 0.2, 1.0, waveH, waveDisp);
|
|
|
|
|
|
vec2 waterUV = vWorldUV * waterNormalTiling + iTime * flowDir * flowSpeed * 0.10;
|
|
|
vec3 waterMap = texture2D(waterNormalMap, waterUV).rgb;
|
|
|
waterMap = waterMap * 2.0 - 1.0;
|
|
|
- vec3 waterPerturb = vec3(waterMap.x * 0.3, 0.0, waterMap.y * 0.3) * waterNormalStrength;
|
|
|
- finalNormal = normalize(finalNormal + waterPerturb);
|
|
|
+ vec3 finalNormal = normalize(vec3(waterMap.x * waterNormalStrength, 1.0, waterMap.y * waterNormalStrength));
|
|
|
|
|
|
vec3 viewDir = normalize(cameraPos - vWorldPosition);
|
|
|
vec3 halfVec = normalize(viewDir + sunDirection);
|
|
|
@@ -337,7 +287,6 @@ export const StylizedWaterMaterial = new THREE.ShaderMaterial({
|
|
|
cameraFar: { value: 1000.0 },
|
|
|
waterLevel: { value: 0.0 },
|
|
|
waveHeight: { value: 0.6 },
|
|
|
- waveFrequency: { value: 1.0 },
|
|
|
flowSpeed: { value: 0.5 },
|
|
|
shallowColor: { value: new THREE.Color('#566c67') },
|
|
|
deepColor: { value: new THREE.Color('#0a2a4a') },
|