3 static void shader_water_link(void);
4 static void shader_water_register(void);
5 static struct vg_shader _shader_water
= {
7 .link
= shader_water_link
,
10 .orig_file
= "../shaders/water.vs",
12 "layout (location=0) in vec3 a_co;\n"
13 "layout (location=1) in vec3 a_norm;\n"
14 "layout (location=2) in vec4 a_colour;\n"
15 "layout (location=3) in vec2 a_uv;\n"
20 "uniform mat4x3 uMdl;\n"
21 "uniform vec4 uDepthBounds;\n"
29 " vec3 world_pos = uMdl * vec4( a_co, 1.0 );\n"
30 " gl_Position = uPv * vec4(world_pos,1.0);\n"
32 " vec2 depth_coords = (world_pos.xz-uDepthBounds.xy)*uDepthBounds.zw;\n"
33 " aUv = vec4(world_pos.xz*0.005,depth_coords);\n"
36 " aDepth = gl_Position.z;\n"
41 .orig_file
= "../shaders/water.fs",
43 "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue, \n"
44 " vec4 beneath, vec4 above )\n"
46 " vec3 colour_shore = vec3( 0.21, 0.6, 0.8 );\n"
47 " vec3 colour_ocean = vec3( 0.01, 0.1, 0.2 );\n"
48 " vec3 surface_tint = mix(colour_shore, colour_ocean, depthvalue);\n"
50 " float ffresnel = pow(1.0-dot( vnorm, halfview ),5.0);\n"
52 " vec3 lightdir = vec3(0.95,0.0,-0.3);\n"
53 " vec3 specdir = reflect( -lightdir, vnorm );\n"
54 " float spec = pow(max(dot(halfview,specdir),0.0),20.0)*0.3;\n"
57 " float depthblend = pow( beneath.a,0.8 );\n"
60 " vec3 vsurface = mix(surface_tint, above.rgb, ffresnel );\n"
61 " //vsurface += spec;\n"
63 " return vec4( vsurface,depthblend );\n"
68 "out vec4 FragColor;\n"
70 "uniform sampler2D uTexMain;\n"
71 "uniform sampler2D uTexDudv;\n"
72 "uniform sampler2D uTexDepth;\n"
73 "uniform sampler2D uTexBack;\n"
75 "uniform vec2 uInvRes;\n"
76 "uniform float uTime;\n"
78 "uniform vec3 uCamera;\n"
79 "uniform float uSurfaceY;\n"
87 " // Create texture coords\n"
88 " vec2 ssuv = gl_FragCoord.xy*uInvRes;\n"
90 " // Surface colour composite\n"
91 " float depthvalue = texture( uTexDepth, aUv.zw ).r;\n"
93 " vec4 dudva = texture(uTexDudv, aUv.xy + vec2(uTime*0.008,uTime*0.006))-0.5;\n"
94 " vec4 dudvb = texture(uTexDudv, aUv.xy*7.0-vec2(uTime*0.003,uTime*0.03))-0.5;\n"
96 " vec3 surfnorm = dudva.rgb + dudvb.rgb;\n"
97 " surfnorm = normalize(vec3(0.0,1.0,0.0) + dudva.xyz*0.4 + dudvb.xyz*0.1);\n"
100 " float fband = fract( aCo.z*0.02+uTime*0.1+depthvalue*10.0 );\n"
101 " fband = step( fband+dudva.a*0.8, 0.3 ) * max((1.0-depthvalue*4.0),0.0);\n"
104 " vec3 halfview = -normalize( aCo-uCamera );\n"
106 " // Sample textures\n"
107 " vec4 above = texture( uTexMain, ssuv+ surfnorm.xz*0.2 );\n"
108 " vec4 beneath = texture( uTexBack, ssuv );\n"
111 " //vec4 horizon = vec4( 0.5, 0.6, 0.9, 1.0 );\n"
112 " vec4 horizon = vec4( 0.7,0.8,0.88, 1.0 );\n"
113 " float fdist = pow(length( aCo.xz-uCamera.xz ) * 0.00047, 2.6);\n"
116 " vec4 vsurface = water_surf( halfview, surfnorm, depthvalue, beneath, above );\n"
117 " vsurface.a -= fdist;\n"
118 " FragColor = mix( vsurface, vec4(1.0,1.0,1.0,0.5), fband );\n"
123 static GLuint _uniform_water_uPv
;
124 static GLuint _uniform_water_uMdl
;
125 static GLuint _uniform_water_uDepthBounds
;
126 static GLuint _uniform_water_uTexMain
;
127 static GLuint _uniform_water_uTexDudv
;
128 static GLuint _uniform_water_uTexDepth
;
129 static GLuint _uniform_water_uTexBack
;
130 static GLuint _uniform_water_uInvRes
;
131 static GLuint _uniform_water_uTime
;
132 static GLuint _uniform_water_uCamera
;
133 static GLuint _uniform_water_uSurfaceY
;
134 static void shader_water_uPv(m4x4f m
){
135 glUniformMatrix4fv( _uniform_water_uPv
, 1, GL_FALSE
, (float *)m
);
137 static void shader_water_uMdl(m4x3f m
){
138 glUniformMatrix4x3fv( _uniform_water_uMdl
, 1, GL_FALSE
, (float *)m
);
140 static void shader_water_uDepthBounds(v4f v
){
141 glUniform4fv( _uniform_water_uDepthBounds
, 1, v
);
143 static void shader_water_uTexMain(int i
){
144 glUniform1i( _uniform_water_uTexMain
, i
);
146 static void shader_water_uTexDudv(int i
){
147 glUniform1i( _uniform_water_uTexDudv
, i
);
149 static void shader_water_uTexDepth(int i
){
150 glUniform1i( _uniform_water_uTexDepth
, i
);
152 static void shader_water_uTexBack(int i
){
153 glUniform1i( _uniform_water_uTexBack
, i
);
155 static void shader_water_uInvRes(v2f v
){
156 glUniform2fv( _uniform_water_uInvRes
, 1, v
);
158 static void shader_water_uTime(float f
){
159 glUniform1f( _uniform_water_uTime
, f
);
161 static void shader_water_uCamera(v3f v
){
162 glUniform3fv( _uniform_water_uCamera
, 1, v
);
164 static void shader_water_uSurfaceY(float f
){
165 glUniform1f( _uniform_water_uSurfaceY
, f
);
167 static void shader_water_register(void){
168 vg_shader_register( &_shader_water
);
170 static void shader_water_use(void){ glUseProgram(_shader_water
.id
); }
171 static void shader_water_link(void){
172 _uniform_water_uPv
= glGetUniformLocation( _shader_water
.id
, "uPv" );
173 _uniform_water_uMdl
= glGetUniformLocation( _shader_water
.id
, "uMdl" );
174 _uniform_water_uDepthBounds
= glGetUniformLocation( _shader_water
.id
, "uDepthBounds" );
175 _uniform_water_uTexMain
= glGetUniformLocation( _shader_water
.id
, "uTexMain" );
176 _uniform_water_uTexDudv
= glGetUniformLocation( _shader_water
.id
, "uTexDudv" );
177 _uniform_water_uTexDepth
= glGetUniformLocation( _shader_water
.id
, "uTexDepth" );
178 _uniform_water_uTexBack
= glGetUniformLocation( _shader_water
.id
, "uTexBack" );
179 _uniform_water_uInvRes
= glGetUniformLocation( _shader_water
.id
, "uInvRes" );
180 _uniform_water_uTime
= glGetUniformLocation( _shader_water
.id
, "uTime" );
181 _uniform_water_uCamera
= glGetUniformLocation( _shader_water
.id
, "uCamera" );
182 _uniform_water_uSurfaceY
= glGetUniformLocation( _shader_water
.id
, "uSurfaceY" );
184 #endif /* SHADER_water_H */