From fc6bd8e784e97373dce8b0424f47dc722ce793a8 Mon Sep 17 00:00:00 2001 From: Lazaroth Date: Tue, 3 Feb 2015 00:23:30 +0100 Subject: [PATCH] Water tweaks As per https://forum.openmw.org/viewtopic.php?f=3&t=2492 Also did a quick remove trailing spaces. --- files/materials/water.shader | 101 +++++++++++++++++------------------ 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/files/materials/water.shader b/files/materials/water.shader index 4dec57276..99a52c801 100644 --- a/files/materials/water.shader +++ b/files/materials/water.shader @@ -4,7 +4,7 @@ #define SIMPLE_WATER @shGlobalSettingBool(simple_water) #if SIMPLE_WATER - // --------------------------------------- SIMPLE WATER --------------------------------------------------- + // --------------------------------------- SIMPLE WATER --------------------------------------------------- #define FOG @shGlobalSettingBool(fog) @@ -42,7 +42,7 @@ { shOutputColour(0).xyz = shSample(animatedTexture, UV * float2(15.0, 15.0)).xyz * float3(1.0, 1.0, 1.0); shOutputColour(0).w = 0.7; - + #if FOG float fogValue = shSaturate((depth - fogParams.y) * fogParams.w); shOutputColour(0).xyz = shLerp (shOutputColour(0).xyz, fogColor, fogValue); @@ -71,7 +71,7 @@ SH_BEGIN_PROGRAM shUniform(float4x4, wvp) @shAutoConstant(wvp, worldviewproj_matrix) - + shOutput(float3, screenCoordsPassthrough) shOutput(float4, position) shOutput(float, depthPassthrough) @@ -96,25 +96,25 @@ SH_START_PROGRAM { shOutputPosition = shMatrixMult(wvp, shInputPosition); - - + + #if !SH_GLSL float4x4 scalemat = float4x4( 0.5, 0.0, 0.0, 0.5, 0.0, -0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0 ); - #else - mat4 scalemat = mat4(0.5, 0.0, 0.0, 0.0, + #else + mat4 scalemat = mat4(0.5, 0.0, 0.0, 0.0, 0.0, -0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.5, 0.5, 1.0); #endif - + float4 texcoordProj = shMatrixMult(scalemat, shOutputPosition); screenCoordsPassthrough = float3(texcoordProj.x, texcoordProj.y, texcoordProj.w); - + position = shInputPosition; - + depthPassthrough = shOutputPosition.z; @@ -135,29 +135,28 @@ #define VISIBILITY 1500.0 // how far you can look through water - #define BIG_WAVES_X 0.3 // strength of big waves - #define BIG_WAVES_Y 0.3 - - #define MID_WAVES_X 0.3 // strength of middle sized waves - #define MID_WAVES_Y 0.15 - - #define SMALL_WAVES_X 0.15 // strength of small waves - #define SMALL_WAVES_Y 0.1 - - #define WAVE_CHOPPYNESS 0.15 // wave choppyness - #define WAVE_SCALE 75.0 // overall wave scale + #define BIG_WAVES_X 0.1 // strength of big waves + #define BIG_WAVES_Y 0.1 - #define BUMP 1.5 // overall water surface bumpiness - #define REFL_BUMP 0.08 // reflection distortion amount + #define MID_WAVES_X 0.1 // strength of middle sized waves + #define MID_WAVES_Y 0.1 + + #define SMALL_WAVES_X 0.1 // strength of small waves + #define SMALL_WAVES_Y 0.1 + + #define WAVE_CHOPPYNESS 0.05 // wave choppyness + #define WAVE_SCALE 75.0 // overall wave scale + + #define BUMP 0.5 // overall water surface bumpiness + #define REFL_BUMP 0.15 // reflection distortion amount #define REFR_BUMP 0.06 // refraction distortion amount #define SCATTER_AMOUNT 0.3 // amount of sunlight scattering #define SCATTER_COLOUR float3(0.0,1.0,0.95) // colour of sunlight scattering - #define SUN_EXT float3(0.45, 0.55, 0.68) //sunlight extinction - - #define SPEC_HARDNESS 256.0 // specular highlights hardness - + #define SUN_EXT float3(0.45, 0.55, 0.68) //sunlight extinction + + #define SPEC_HARDNESS 256.0 // specular highlights hardness // --------------------------------------------------------------- @@ -192,9 +191,9 @@ shUniform(float3, rippleCenter) @shSharedParameter(rippleCenter, rippleCenter) shUniform(float, rippleAreaLength) @shSharedParameter(rippleAreaLength, rippleAreaLength) #endif - + shUniform(float, far) @shAutoConstant(far, far_clip_distance) - + shSampler2D(reflectionMap) #if REFRACTION shSampler2D(refractionMap) @@ -207,23 +206,23 @@ #if RIPPLES shSampler2D(rippleNormalMap) #endif - + shUniform(float3, windDir_windSpeed) @shSharedParameter(windDir_windSpeed) #define WIND_SPEED windDir_windSpeed.z #define WIND_DIR windDir_windSpeed.xy - + shUniform(float, waterTimer) @shSharedParameter(waterTimer) shUniform(float2, waterSunFade_sunHeight) @shSharedParameter(waterSunFade_sunHeight) - + shUniform(float4, sunPosition) @shAutoConstant(sunPosition, light_position, 0) shUniform(float4, sunSpecular) @shAutoConstant(sunSpecular, light_specular_colour, 0) - + shUniform(float, renderTargetFlipping) @shAutoConstant(renderTargetFlipping, render_target_flipping) - - + + shUniform(float3, fogColor) @shAutoConstant(fogColor, fog_colour) shUniform(float4, fogParams) @shAutoConstant(fogParams, fog_params) - + shUniform(float4, cameraPos) @shAutoConstant(cameraPos, camera_position_object_space) @@ -244,7 +243,7 @@ #if SHADOWS || SHADOWS_PSSM shUniform(float4, shadowFar_fadeStart) @shSharedParameter(shadowFar_fadeStart) #endif - + SH_START_PROGRAM { @@ -279,19 +278,19 @@ float3 normal0 = 2.0 * shSample(normalMap, nCoord + float2(-waterTimer*0.015,-waterTimer*0.005)).rgb - 1.0; nCoord = UV * (WAVE_SCALE * 0.1) + WIND_DIR * waterTimer * (WIND_SPEED*0.08)-(normal0.xy/normal0.zz)*WAVE_CHOPPYNESS; float3 normal1 = 2.0 * shSample(normalMap, nCoord + float2(+waterTimer*0.020,+waterTimer*0.015)).rgb - 1.0; - + nCoord = UV * (WAVE_SCALE * 0.25) + WIND_DIR * waterTimer * (WIND_SPEED*0.07)-(normal1.xy/normal1.zz)*WAVE_CHOPPYNESS; float3 normal2 = 2.0 * shSample(normalMap, nCoord + float2(-waterTimer*0.04,-waterTimer*0.03)).rgb - 1.0; nCoord = UV * (WAVE_SCALE * 0.5) + WIND_DIR * waterTimer * (WIND_SPEED*0.09)-(normal2.xy/normal2.z)*WAVE_CHOPPYNESS; float3 normal3 = 2.0 * shSample(normalMap, nCoord + float2(+waterTimer*0.03,+waterTimer*0.04)).rgb - 1.0; - + nCoord = UV * (WAVE_SCALE* 1.0) + WIND_DIR * waterTimer * (WIND_SPEED*0.4)-(normal3.xy/normal3.zz)*WAVE_CHOPPYNESS; - float3 normal4 = 2.0 * shSample(normalMap, nCoord + float2(-waterTimer*0.02,+waterTimer*0.1)).rgb - 1.0; + float3 normal4 = 2.0 * shSample(normalMap, nCoord + float2(-waterTimer*0.02,+waterTimer*0.1)).rgb - 1.0; nCoord = UV * (WAVE_SCALE * 2.0) + WIND_DIR * waterTimer * (WIND_SPEED*0.7)-(normal4.xy/normal4.zz)*WAVE_CHOPPYNESS; float3 normal5 = 2.0 * shSample(normalMap, nCoord + float2(+waterTimer*0.1,-waterTimer*0.06)).rgb - 1.0; - - + + float3 normal = (normal0 * BIG_WAVES_X + normal1 * BIG_WAVES_Y + normal2 * MID_WAVES_X + normal3 * MID_WAVES_Y + normal4 * SMALL_WAVES_X + normal5 * SMALL_WAVES_Y); @@ -304,25 +303,25 @@ normal = normalize(float3(normal.x * BUMP + normal_ripple.x, normal.y * BUMP + normal_ripple.y, normal.z)); normal = float3(normal.x, normal.y, -normal.z); - // normal for sunlight scattering + // normal for sunlight scattering float3 lNormal = (normal0 * BIG_WAVES_X*0.5 + normal1 * BIG_WAVES_Y*0.5 + normal2 * MID_WAVES_X*0.2 + normal3 * MID_WAVES_Y*0.2 + normal4 * SMALL_WAVES_X*0.1 + normal5 * SMALL_WAVES_Y*0.1).xyz; lNormal = normalize(float3(lNormal.x * BUMP, lNormal.y * BUMP, lNormal.z)); lNormal = float3(lNormal.x, lNormal.y, -lNormal.z); - + float3 lVec = normalize(sunPosition.xyz); float3 vVec = normalize(position.xyz - cameraPos.xyz); - - + + float isUnderwater = (cameraPos.z > 0.0) ? 0.0 : 1.0; - + // sunlight scattering float3 pNormal = float3(0,0,1); float3 lR = reflect(lVec, lNormal); float3 llR = reflect(lVec, pNormal); - + float s = shSaturate(dot(lR, vVec)*2.0-1.2); float lightScatter = shadow * shSaturate(dot(-lVec,lNormal)*0.7+0.3) * s * SCATTER_AMOUNT * waterSunFade_sunHeight.x * shSaturate(1.0-exp(-waterSunFade_sunHeight.y)); float3 scatterColour = shLerp(float3(SCATTER_COLOUR)*float3(1.0,0.4,0.0), SCATTER_COLOUR, shSaturate(1.0-exp(-waterSunFade_sunHeight.y*SUN_EXT))); @@ -330,12 +329,12 @@ // fresnel float ior = (cameraPos.z>0.0)?(1.333/1.0):(1.0/1.333); //air to water; water to air float fresnel = fresnel_dielectric(-vVec, normal, ior); - + fresnel = shSaturate(fresnel); - + // reflection float3 reflection = shSample(reflectionMap, screenCoords+(normal.xy*REFL_BUMP)).rgb; - + // refraction float3 R = reflect(vVec, normal);