1
0
Fork 0
fgdata/Shaders/HDR/water.frag
2024-01-31 01:17:50 +01:00

71 lines
2.5 KiB
GLSL

#version 330 core
layout(location = 0) out vec4 out_gbuffer0;
layout(location = 1) out vec4 out_gbuffer1;
in VS_OUT {
float flogz;
vec2 water_texcoord;
vec2 topo_texcoord;
vec3 vertex_normal;
vec3 view_vector;
} fs_in;
uniform sampler2D perlin_normalmap;
uniform sampler2D water_dudvmap;
uniform sampler2D water_normalmap;
uniform sampler2D water_colormap;
uniform float osg_SimulationTime;
const vec2 sca = vec2(0.005);
const vec2 sca2 = vec2(0.02);
const vec2 tscale = vec2(0.25);
const float scale = 5.0;
const float mix_factor = 0.5;
// normal_encoding.glsl
vec2 encode_normal(vec3 n);
// color.glsl
vec3 eotf_inverse_sRGB(vec3 srgb);
// normalmap.glsl
mat3 cotangent_frame(vec3 N, vec3 p, vec2 uv);
// logarithmic_depth.glsl
float logdepth_encode(float z);
void get_rotation_matrix(float angle, out mat2 rotmat)
{
rotmat = mat2(cos(angle), -sin(angle),
sin(angle), cos(angle));
}
void main()
{
vec2 disdis = texture(water_dudvmap, vec2(fs_in.water_texcoord * tscale) * scale).rg * 2.0 - 1.0;
vec3 N0 = vec3(texture(water_normalmap, vec2(fs_in.water_texcoord + disdis * sca2) * scale) * 2.0 - 1.0);
vec3 N1 = vec3(texture(perlin_normalmap, vec2(fs_in.water_texcoord + disdis * sca) * scale) * 2.0 - 1.0);
N0 += vec3(texture(water_normalmap, vec2(fs_in.water_texcoord * tscale) * scale) * 2.0 - 1.0);
N1 += vec3(texture(perlin_normalmap, vec2(fs_in.water_texcoord * tscale) * scale) * 2.0 - 1.0);
mat2 rotmatrix;
get_rotation_matrix(radians(2.0 * sin(osg_SimulationTime * 0.005)), rotmatrix);
N0 += vec3(texture(water_normalmap, vec2(fs_in.water_texcoord * rotmatrix * (tscale + sca2)) * scale) * 2.0 - 1.0);
N1 += vec3(texture(perlin_normalmap, vec2(fs_in.water_texcoord * rotmatrix * (tscale + sca2)) * scale) * 2.0 - 1.0);
get_rotation_matrix(radians(-4.0 * sin(osg_SimulationTime * 0.003)), rotmatrix);
N0 += vec3(texture(water_normalmap, vec2(fs_in.water_texcoord * rotmatrix + disdis * sca2) * scale) * 2.0 - 1.0);
N1 += vec3(texture(perlin_normalmap, vec2(fs_in.water_texcoord * rotmatrix + disdis * sca) * scale) * 2.0 - 1.0);
vec3 N = normalize(mix(N0, N1, mix_factor));
mat3 TBN = cotangent_frame(fs_in.vertex_normal, fs_in.view_vector, fs_in.water_texcoord);
N = normalize(TBN * N);
vec3 floor_color = eotf_inverse_sRGB(texture(water_colormap, fs_in.topo_texcoord).rgb);
out_gbuffer0.rg = encode_normal(N);
out_gbuffer1.rgb = floor_color;
gl_FragDepth = logdepth_encode(fs_in.flogz);
}