#version GLSL_VERSION /*============================================================================== VARS ==============================================================================*/ #var DEPTH_RGBA 0 #var WATER_EFFECTS 0 /*============================================================================*/ #include #include uniform mat4 u_view_proj_matrix; uniform vec3 u_sun_direction; #if DEPTH_RGBA && WATER_EFFECTS uniform vec4 u_camera_quat; uniform float u_cam_water_depth; #endif /*============================================================================== SHADER INTERFACE ==============================================================================*/ GLSL_IN vec2 a_bb_vertex; //------------------------------------------------------------------------------ #if DEPTH_RGBA && WATER_EFFECTS GLSL_OUT float v_underwater; GLSL_OUT vec2 v_texture_offset; #endif GLSL_OUT vec2 v_texcoord; GLSL_OUT vec4 v_sun_pos_clip; /*============================================================================== MAIN ==============================================================================*/ void main(void) { v_texcoord = a_bb_vertex; vec3 dir = normalize(u_sun_direction); // locate sun center v_sun_pos_clip = u_view_proj_matrix * vec4(dir, 0.0); #if DEPTH_RGBA && WATER_EFFECTS if (u_cam_water_depth < 0.0) { v_underwater = 1.0; vec3 y_axis = vec3 (0.0, 1.0, 0.0); vec3 cam_y_dir = qrot(u_camera_quat, y_axis); cam_y_dir = normalize(cam_y_dir); //angle cos between camera local y and global y float cos_camz_y = dot(cam_y_dir, vec3(0.0, 1.0, 0.0)); float atan2_xz = atan(cam_y_dir.x, cam_y_dir.z); //offset generated by camera rotation v_texture_offset = vec2(-atan2_xz, acos(cos_camz_y)); } else { v_underwater = 0.0; } #endif v_sun_pos_clip.xy = 0.5 * (v_sun_pos_clip.xy / v_sun_pos_clip.w + 1.0); //remove double god_rays v_sun_pos_clip += 99999.0 * step(v_sun_pos_clip.z, 0.0); gl_Position = vec4(2.0 * a_bb_vertex.xy - 1.0, 0.0, 1.0); }