|
|
@@ -66,7 +66,10 @@ uniform float depthRange;
|
|
|
uniform vec3 cameraPos;
|
|
|
uniform vec3 sunDirection;
|
|
|
uniform vec2 flowDirection;
|
|
|
-uniform sampler2D waterNormalMap;
|
|
|
+uniform float normalRotation;
|
|
|
+uniform sampler2D waterNormalMap1;
|
|
|
+uniform sampler2D waterNormalMap2;
|
|
|
+uniform sampler2D waterNormalMap3;
|
|
|
uniform float waterNormalStrength;
|
|
|
uniform float waterNormalTiling;
|
|
|
uniform float collisionFoamThreshold;
|
|
|
@@ -199,10 +202,19 @@ void main() {
|
|
|
vec2 waveDisp;
|
|
|
computeWaveData(wavePos, time, waveHeight * 0.2, 1.0, waveH, waveDisp);
|
|
|
|
|
|
+ float rotRad = normalRotation * 3.14159265 / 180.0;
|
|
|
+ float cosA = cos(rotRad);
|
|
|
+ float sinA = sin(rotRad);
|
|
|
vec2 waterUV = vWorldUV * waterNormalTiling + iTime * flowDir * flowSpeed * 0.10;
|
|
|
- vec3 waterMap = texture2D(waterNormalMap, waterUV).rgb;
|
|
|
- waterMap = waterMap * 2.0 - 1.0;
|
|
|
- vec3 finalNormal = normalize(vec3(waterMap.x * waterNormalStrength, 1.0, waterMap.y * waterNormalStrength));
|
|
|
+ vec3 n1 = texture2D(waterNormalMap1, waterUV).rgb * 2.0 - 1.0;
|
|
|
+ vec3 n2 = texture2D(waterNormalMap2, waterUV * 1.3 + 0.5).rgb * 2.0 - 1.0;
|
|
|
+ vec3 n3 = texture2D(waterNormalMap3, waterUV * 0.7 + 1.0).rgb * 2.0 - 1.0;
|
|
|
+ vec3 waterMap = normalize(n1 + n2 + n3);
|
|
|
+ vec3 finalNormal = normalize(vec3(
|
|
|
+ (waterMap.x * cosA - waterMap.y * sinA) * waterNormalStrength,
|
|
|
+ 1.0,
|
|
|
+ (waterMap.x * sinA + waterMap.y * cosA) * waterNormalStrength
|
|
|
+ ));
|
|
|
|
|
|
vec3 viewDir = normalize(cameraPos - vWorldPosition);
|
|
|
vec3 halfVec = normalize(viewDir + sunDirection);
|
|
|
@@ -224,8 +236,7 @@ void main() {
|
|
|
float foamShore = smoothstep(0.3, 1.5, waterDepth);
|
|
|
float foam = (1.0 - foamShore) * foamNoise * foamIntensity * 1.5;
|
|
|
|
|
|
- float wavePeakFoam = smoothstep(0.6, 1.0, abs(waveH) / max(waveHeight * 0.1, 0.01));
|
|
|
- foam += wavePeakFoam * foamNoise * foamIntensity * 0.3;
|
|
|
+ float wavePeakFoam = 0.0;
|
|
|
|
|
|
foam = clamp(foam, 0.0, 1.0);
|
|
|
|
|
|
@@ -269,11 +280,16 @@ void main() {
|
|
|
|
|
|
const textureLoader = new THREE.TextureLoader();
|
|
|
|
|
|
-const waterNormalTexture = textureLoader.load(
|
|
|
- new URL('../assets/waternormals.jpg', import.meta.url).href
|
|
|
-);
|
|
|
-waterNormalTexture.wrapS = THREE.RepeatWrapping;
|
|
|
-waterNormalTexture.wrapT = THREE.RepeatWrapping;
|
|
|
+function loadRepeatTexture(url: string): THREE.Texture {
|
|
|
+ const tex = textureLoader.load(new URL(url, import.meta.url).href)
|
|
|
+ tex.wrapS = THREE.RepeatWrapping
|
|
|
+ tex.wrapT = THREE.RepeatWrapping
|
|
|
+ return tex
|
|
|
+}
|
|
|
+
|
|
|
+const waterNormalTex1 = loadRepeatTexture('../assets/texture/Water_1_Normal.PNG')
|
|
|
+const waterNormalTex2 = loadRepeatTexture('../assets/texture/Water_2_Normal.PNG')
|
|
|
+const waterNormalTex3 = loadRepeatTexture('../assets/texture/Water_3_Normal.PNG')
|
|
|
|
|
|
export const StylizedWaterMaterial = new THREE.ShaderMaterial({
|
|
|
transparent: true,
|
|
|
@@ -300,7 +316,10 @@ export const StylizedWaterMaterial = new THREE.ShaderMaterial({
|
|
|
cameraPos: { value: new THREE.Vector3(0, 0, 0) },
|
|
|
sunDirection: { value: new THREE.Vector3(0.5, 0.8, 0.3).normalize() },
|
|
|
flowDirection: { value: new THREE.Vector2(1.0, 0.0) },
|
|
|
- waterNormalMap: { value: waterNormalTexture },
|
|
|
+ normalRotation: { value: 0 },
|
|
|
+ waterNormalMap1: { value: waterNormalTex1 },
|
|
|
+ waterNormalMap2: { value: waterNormalTex2 },
|
|
|
+ waterNormalMap3: { value: waterNormalTex3 },
|
|
|
waterNormalStrength: { value: 2.0 },
|
|
|
waterNormalTiling: { value: 0.26 },
|
|
|
collisionFoamThreshold: { value: 0.10 },
|