god_rays.glslv 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #version GLSL_VERSION
  2. /*==============================================================================
  3. VARS
  4. ==============================================================================*/
  5. #var DEPTH_RGBA 0
  6. #var WATER_EFFECTS 0
  7. /*============================================================================*/
  8. #include <std.glsl>
  9. #include <math.glslv>
  10. uniform mat4 u_view_proj_matrix;
  11. uniform vec3 u_sun_direction;
  12. #if DEPTH_RGBA && WATER_EFFECTS
  13. uniform vec4 u_camera_quat;
  14. uniform float u_cam_water_depth;
  15. #endif
  16. /*==============================================================================
  17. SHADER INTERFACE
  18. ==============================================================================*/
  19. GLSL_IN vec2 a_bb_vertex;
  20. //------------------------------------------------------------------------------
  21. #if DEPTH_RGBA && WATER_EFFECTS
  22. GLSL_OUT float v_underwater;
  23. GLSL_OUT vec2 v_texture_offset;
  24. #endif
  25. GLSL_OUT vec2 v_texcoord;
  26. GLSL_OUT vec4 v_sun_pos_clip;
  27. /*==============================================================================
  28. MAIN
  29. ==============================================================================*/
  30. void main(void) {
  31. v_texcoord = a_bb_vertex;
  32. vec3 dir = normalize(u_sun_direction);
  33. // locate sun center
  34. v_sun_pos_clip = u_view_proj_matrix * vec4(dir, 0.0);
  35. #if DEPTH_RGBA && WATER_EFFECTS
  36. if (u_cam_water_depth < 0.0) {
  37. v_underwater = 1.0;
  38. vec3 y_axis = vec3 (0.0, 1.0, 0.0);
  39. vec3 cam_y_dir = qrot(u_camera_quat, y_axis);
  40. cam_y_dir = normalize(cam_y_dir);
  41. //angle cos between camera local y and global y
  42. float cos_camz_y = dot(cam_y_dir, vec3(0.0, 1.0, 0.0));
  43. float atan2_xz = atan(cam_y_dir.x, cam_y_dir.z);
  44. //offset generated by camera rotation
  45. v_texture_offset = vec2(-atan2_xz, acos(cos_camz_y));
  46. } else {
  47. v_underwater = 0.0;
  48. }
  49. #endif
  50. v_sun_pos_clip.xy = 0.5 * (v_sun_pos_clip.xy / v_sun_pos_clip.w + 1.0);
  51. //remove double god_rays
  52. v_sun_pos_clip += 99999.0 * step(v_sun_pos_clip.z, 0.0);
  53. gl_Position = vec4(2.0 * a_bb_vertex.xy - 1.0, 0.0, 1.0);
  54. }