1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #version GLSL_VERSION
- /*==============================================================================
- VARS
- ==============================================================================*/
- #var DEPTH_RGBA 0
- #var WATER_EFFECTS 0
- /*============================================================================*/
- #include <std.glsl>
- #include <math.glslv>
- 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);
- }
|