Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/shaders/glsl/water_high.fs
#version 110 | #version 110 | ||||
#include "common/fog.h" | |||||
#if USE_SHADOWS_ON_WATER | |||||
#include "common/shadows_fragment.h" | |||||
#endif | |||||
// Environment settings | // Environment settings | ||||
uniform vec3 ambient; | uniform vec3 ambient; | ||||
uniform vec3 sunDir; | uniform vec3 sunDir; | ||||
uniform vec3 sunColor; | uniform vec3 sunColor; | ||||
uniform mat4 skyBoxRot; | uniform mat4 skyBoxRot; | ||||
uniform vec3 cameraPos; | uniform vec3 cameraPos; | ||||
uniform sampler2D losTex; | uniform sampler2D losTex; | ||||
uniform float waviness; // "Wildness" of the reflections and refractions; choose based on texture | uniform float waviness; // "Wildness" of the reflections and refractions; choose based on texture | ||||
uniform vec3 color; // color of the water | uniform vec3 color; // color of the water | ||||
uniform vec3 tint; // Tint for refraction (used to simulate particles in water) | uniform vec3 tint; // Tint for refraction (used to simulate particles in water) | ||||
uniform float murkiness; // Amount of tint to blend in with the refracted color | uniform float murkiness; // Amount of tint to blend in with the refracted color | ||||
uniform float windAngle; | uniform float windAngle; | ||||
varying vec2 WindCosSin; | varying vec2 WindCosSin; | ||||
uniform vec3 fogColor; | |||||
uniform vec2 fogParams; | |||||
uniform vec2 screenSize; | uniform vec2 screenSize; | ||||
varying float moddedTime; | varying float moddedTime; | ||||
varying vec3 worldPos; | varying vec3 worldPos; | ||||
varying float waterDepth; | varying float waterDepth; | ||||
varying vec2 waterInfo; | varying vec2 waterInfo; | ||||
varying vec3 v_eyeVec; | varying vec3 v_eyeVec; | ||||
Show All 29 Lines | #if USE_REFRACTION | ||||
uniform sampler2D refractionMap; | uniform sampler2D refractionMap; | ||||
#if USE_REAL_DEPTH | #if USE_REAL_DEPTH | ||||
uniform sampler2D depthTex; | uniform sampler2D depthTex; | ||||
uniform mat4 projInvTransform; | uniform mat4 projInvTransform; | ||||
uniform mat4 viewInvTransform; | uniform mat4 viewInvTransform; | ||||
#endif | #endif | ||||
#endif | #endif | ||||
#if USE_SHADOWS_ON_WATER && USE_SHADOW | |||||
varying vec4 v_shadow; | |||||
#if USE_SHADOW_SAMPLER | |||||
uniform sampler2DShadow shadowTex; | |||||
#if USE_SHADOW_PCF | |||||
uniform vec4 shadowScale; | |||||
#endif | |||||
#else | |||||
uniform sampler2D shadowTex; | |||||
#endif | |||||
float get_shadow(vec4 coords) | |||||
{ | |||||
#if USE_SHADOWS_ON_WATER && !DISABLE_RECEIVE_SHADOWS | |||||
#if USE_SHADOW_SAMPLER | |||||
#if USE_SHADOW_PCF | |||||
vec2 offset = fract(coords.xy - 0.5); | |||||
vec4 size = vec4(offset + 1.0, 2.0 - offset); | |||||
vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (coords.xy - 0.5 * offset).xyxy) * shadowScale.zwzw; | |||||
return (1.0 / 9.0) * dot(size.zxzx * size.wwyy, | |||||
vec4(shadow2D(shadowTex, vec3(weight.zw, coords.z)).r, | |||||
shadow2D(shadowTex, vec3(weight.xw, coords.z)).r, | |||||
shadow2D(shadowTex, vec3(weight.zy, coords.z)).r, | |||||
shadow2D(shadowTex, vec3(weight.xy, coords.z)).r)); | |||||
#else | |||||
return shadow2D(shadowTex, coords.xyz).r; | |||||
#endif | |||||
#else | |||||
if (coords.z >= 1.0) | |||||
return 1.0; | |||||
return (coords.z <= texture2D(shadowTex, coords.xy).x ? 1.0 : 0.0); | |||||
#endif | |||||
#else | |||||
return 1.0; | |||||
#endif | |||||
} | |||||
#endif | |||||
// TODO: convert this to something not only for AABBs | // TODO: convert this to something not only for AABBs | ||||
struct Ray { | struct Ray { | ||||
vec3 Origin; | vec3 Origin; | ||||
vec3 Direction; | vec3 Direction; | ||||
}; | }; | ||||
float IntersectBox (in Ray ray, in vec3 minimum, in vec3 maximum) | float IntersectBox (in Ray ray, in vec3 minimum, in vec3 maximum) | ||||
{ | { | ||||
vec3 OMIN = ( minimum - ray.Origin ) / ray.Direction; | vec3 OMIN = ( minimum - ray.Origin ) / ray.Direction; | ||||
vec3 OMAX = ( maximum - ray.Origin ) / ray.Direction; | vec3 OMAX = ( maximum - ray.Origin ) / ray.Direction; | ||||
vec3 MAX = max ( OMAX, OMIN ); | vec3 MAX = max ( OMAX, OMIN ); | ||||
return min ( MAX.x, min ( MAX.y, MAX.z ) ); | return min ( MAX.x, min ( MAX.y, MAX.z ) ); | ||||
} | } | ||||
vec3 get_fog(vec3 color) | |||||
{ | |||||
float density = fogParams.x; | |||||
float maxFog = fogParams.y; | |||||
const float LOG2 = 1.442695; | |||||
float z = gl_FragCoord.z / gl_FragCoord.w; | |||||
float fogFactor = exp2(-density * density * z * z * LOG2); | |||||
fogFactor = fogFactor * (1.0 - maxFog) + maxFog; | |||||
fogFactor = clamp(fogFactor, 0.0, 1.0); | |||||
return mix(fogColor, color, fogFactor); | |||||
} | |||||
vec3 getNormal(vec4 fancyeffects) | vec3 getNormal(vec4 fancyeffects) | ||||
{ | { | ||||
float wavyEffect = waveParams1.r; | float wavyEffect = waveParams1.r; | ||||
float baseScale = waveParams1.g; | float baseScale = waveParams1.g; | ||||
float flattenism = waveParams1.b; | float flattenism = waveParams1.b; | ||||
float baseBump = waveParams1.a; | float baseBump = waveParams1.a; | ||||
float BigMovement = waveParams2.b; | float BigMovement = waveParams2.b; | ||||
▲ Show 20 Lines • Show All 216 Lines • ▼ Show 20 Lines | #endif | ||||
float ndotv = clamp(dot(normal, eyeVec), 0.0, 1.0); | float ndotv = clamp(dot(normal, eyeVec), 0.0, 1.0); | ||||
// Fresnel for "how much reflection vs how much refraction". | // Fresnel for "how much reflection vs how much refraction". | ||||
float fresnel = clamp(((pow(1.1 - ndotv, 2.0)) * 1.5), 0.1, 0.75); // Approximation. I'm using 1.1 and not 1.0 because it causes artifacts, see #1714 | float fresnel = clamp(((pow(1.1 - ndotv, 2.0)) * 1.5), 0.1, 0.75); // Approximation. I'm using 1.1 and not 1.0 because it causes artifacts, see #1714 | ||||
vec3 specular = getSpecular(normal, eyeVec); | vec3 specular = getSpecular(normal, eyeVec); | ||||
#if USE_SHADOWS_ON_WATER && USE_SHADOW | #if USE_SHADOWS_ON_WATER && USE_SHADOW | ||||
float shadow = get_shadow(vec4(v_shadow.xy, v_shadow.zw)); | float shadow = get_shadow(); | ||||
float fresShadow = mix(fresnel, fresnel * shadow, 0.05 + murkiness * 0.2); | float fresShadow = mix(fresnel, fresnel * shadow, 0.05 + murkiness * 0.2); | ||||
vec3 color = mix(refrColor.rgb, reflColor.rgb, fresShadow * reflColor.a); | vec3 color = mix(refrColor.rgb, reflColor.rgb, fresShadow * reflColor.a); | ||||
color += shadow * specular; | color += shadow * specular; | ||||
vec4 foam = getFoam(fancyeffects, shadow); | vec4 foam = getFoam(fancyeffects, shadow); | ||||
#else | #else | ||||
vec3 color = mix(refrColor.rgb, reflColor.rgb, fresnel * reflColor.a); | vec3 color = mix(refrColor.rgb, reflColor.rgb, fresnel * reflColor.a); | ||||
color += specular; | color += specular; | ||||
vec4 foam = getFoam(fancyeffects, 1.0); | vec4 foam = getFoam(fancyeffects, 1.0); | ||||
#endif | #endif | ||||
color = clamp(mix(color, foam.rgb, foam.a), 0.0, 1.0); | color = clamp(mix(color, foam.rgb, foam.a), 0.0, 1.0); | ||||
#if USE_FOG | color = applyFog(color); | ||||
color = get_fog(color); | |||||
#endif | |||||
float alpha = refrColor.a; | float alpha = refrColor.a; | ||||
float losMod = texture2D(losTex, losCoords.st).a; | float losMod = texture2D(losTex, losCoords.st).a; | ||||
losMod = losMod < 0.03 ? 0.0 : losMod; | losMod = losMod < 0.03 ? 0.0 : losMod; | ||||
gl_FragColor = vec4(color * losMod, alpha); | gl_FragColor = vec4(color * losMod, alpha); | ||||
} | } |
Wildfire Games · Phabricator