1 #ifndef SHADER_planeinf_H
2 #define SHADER_planeinf_H
3 static void shader_planeinf_link(void);
4 static void shader_planeinf_register(void);
5 static struct vg_shader _shader_planeinf
= {
7 .link
= shader_planeinf_link
,
10 .orig_file
= "../shaders/standard.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"
29 " gl_Position = uPv * vec4( uMdl * vec4(a_co,1.0), 1.0 );\n"
30 " aColour = a_colour;\n"
32 " aNorm = mat3(uMdl) * a_norm;\n"
38 .orig_file
= "../shaders/planeinf.fs",
40 "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue, \n"
41 " vec4 beneath, vec4 above )\n"
43 " vec3 colour_shore = vec3( 0.21, 0.6, 0.8 );\n"
44 " vec3 colour_ocean = vec3( 0.01, 0.1, 0.2 );\n"
45 " vec3 surface_tint = mix(colour_shore, colour_ocean, depthvalue);\n"
47 " float ffresnel = pow(1.0-dot( vnorm, halfview ),5.0);\n"
49 " vec3 lightdir = vec3(0.95,0.0,-0.3);\n"
50 " vec3 specdir = reflect( -lightdir, vnorm );\n"
51 " float spec = pow(max(dot(halfview,specdir),0.0),20.0)*0.3;\n"
54 " float depthblend = pow( beneath.a,0.8 );\n"
57 " vec3 vsurface = mix(surface_tint, above.rgb, ffresnel );\n"
58 " //vsurface += spec;\n"
60 " return vec4( vsurface,depthblend );\n"
65 "out vec4 FragColor;\n"
67 "uniform vec3 uCamera;\n"
68 "uniform vec4 uPlane;\n"
75 "float ray_plane( vec3 pos, vec3 dir, vec4 plane )\n"
77 " float d = dot( plane.xyz, dir );\n"
78 " float t = dot((plane.xyz*plane.w - pos),plane.xyz) / d;\n"
84 " float fdist = ray_plane( uCamera, -aNorm, uPlane );\n"
85 " vec3 world_pos = uCamera - aNorm*fdist;\n"
87 " FragColor = vec4(fract(world_pos*0.1),1.0);\n"
92 static GLuint _uniform_planeinf_uPv
;
93 static GLuint _uniform_planeinf_uMdl
;
94 static GLuint _uniform_planeinf_uCamera
;
95 static GLuint _uniform_planeinf_uPlane
;
96 static void shader_planeinf_uPv(m4x4f m
){
97 glUniformMatrix4fv( _uniform_planeinf_uPv
, 1, GL_FALSE
, (float *)m
);
99 static void shader_planeinf_uMdl(m4x3f m
){
100 glUniformMatrix4x3fv( _uniform_planeinf_uMdl
, 1, GL_FALSE
, (float *)m
);
102 static void shader_planeinf_uCamera(v3f v
){
103 glUniform3fv( _uniform_planeinf_uCamera
, 1, v
);
105 static void shader_planeinf_uPlane(v4f v
){
106 glUniform4fv( _uniform_planeinf_uPlane
, 1, v
);
108 static void shader_planeinf_register(void){
109 vg_shader_register( &_shader_planeinf
);
111 static void shader_planeinf_use(void){ glUseProgram(_shader_planeinf
.id
); }
112 static void shader_planeinf_link(void){
113 _uniform_planeinf_uPv
= glGetUniformLocation( _shader_planeinf
.id
, "uPv" );
114 _uniform_planeinf_uMdl
= glGetUniformLocation( _shader_planeinf
.id
, "uMdl" );
115 _uniform_planeinf_uCamera
= glGetUniformLocation( _shader_planeinf
.id
, "uCamera" );
116 _uniform_planeinf_uPlane
= glGetUniformLocation( _shader_planeinf
.id
, "uPlane" );
118 #endif /* SHADER_planeinf_H */