|
|
|
@ -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 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 BUMP 1.5 // overall water surface bumpiness
|
|
|
|
|
#define REFL_BUMP 0.08 // reflection distortion amount
|
|
|
|
|
#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);
|
|
|
|
|
|
|
|
|
|