mirror.glslf 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #ifndef MIRROR_GLSLF
  2. #define MIRROR_GLSLF
  3. // #import u_plane_reflection u_mirrormap
  4. // #import v_tex_pos_clip u_refl_plane
  5. // #import u_fresnel_params
  6. // #import u_cube_reflection
  7. /*==============================================================================
  8. VARS
  9. ==============================================================================*/
  10. #var REFLECTION_TYPE REFL_NONE
  11. #var REFLECTION_PASS REFL_PASS_NONE
  12. /*============================================================================*/
  13. #include <std.glsl>
  14. #if REFLECTION_TYPE == REFL_PLANE || REFLECTION_TYPE == REFL_CUBE || REFLECTION_TYPE == REFL_MIRRORMAP
  15. #include <color_util.glslf>
  16. #include <math.glslv>
  17. #define REFL_BUMP 0.1
  18. float fresnel_mirror(in vec3 eye_dir, vec3 eye_reflected, float N, float r0)
  19. {
  20. vec3 reflected_halfway = normalize(eye_reflected + eye_dir);
  21. float one_minus_cos_theta = 1.0 - dot(eye_dir, reflected_halfway);
  22. float r = r0 + (1.0 - r0) * pow(one_minus_cos_theta, N);
  23. return r;
  24. }
  25. void apply_mirror(inout vec3 base_color, vec3 eye_dir, vec3 normal,
  26. float reflect_factor, mat3 view_tsr)
  27. {
  28. vec3 eye_reflected = reflect(-eye_dir, normal);
  29. float N = u_fresnel_params[2];
  30. float r0 = u_fresnel_params[3];
  31. float r = 1.0;
  32. // NOTE: fix for devices with low precision
  33. if (N != 0.0)
  34. r = fresnel_mirror(eye_dir, eye_reflected, N, r0);
  35. # if REFLECTION_TYPE == REFL_CUBE
  36. vec3 reflect_color = GLSL_TEXTURE_CUBE(u_cube_reflection, eye_reflected).xyz;
  37. # elif REFLECTION_TYPE == REFL_PLANE
  38. # if REFLECTION_PASS == REFL_PASS_NONE
  39. vec3 norm_proj_refl = u_refl_plane.xyz * dot(normal, u_refl_plane.xyz);
  40. vec3 normal_offset = normal - norm_proj_refl;
  41. vec2 normal_offset_view = tsr9_transform_dir(view_tsr, normal_offset).xy;
  42. vec2 refl_coord = v_tex_pos_clip.xy/ v_tex_pos_clip.z;
  43. refl_coord += normal_offset_view * REFL_BUMP;
  44. vec3 reflect_color = GLSL_TEXTURE(u_plane_reflection, refl_coord).rgb;
  45. # else //REFLECTION_PASS == REFL_PASS_NONE
  46. vec3 reflect_color = vec3(1.0);
  47. reflect_factor = 0.0;
  48. # endif //REFLECTION_PASS == REFL_PASS_NONE
  49. # elif REFLECTION_TYPE == REFL_MIRRORMAP
  50. vec3 reflect_color = GLSL_TEXTURE_CUBE(u_mirrormap, eye_reflected).xyz;
  51. # endif
  52. srgb_to_lin(reflect_color.rgb);
  53. base_color = mix(base_color, reflect_color, reflect_factor * r);
  54. }
  55. vec3 apply_mirror_bsdf(vec3 base_color, vec3 s_color, vec3 eye_dir, vec3 normal,
  56. float metalness, mat3 view_tsr)
  57. {
  58. # if REFLECTION_TYPE == REFL_CUBE
  59. vec3 eye_reflected = reflect(-eye_dir, normal);
  60. vec3 reflect_color = GLSL_TEXTURE_CUBE(u_cube_reflection, eye_reflected).xyz;
  61. srgb_to_lin(reflect_color);
  62. reflect_color *= s_color;
  63. # elif REFLECTION_TYPE == REFL_PLANE && REFLECTION_PASS == REFL_PASS_NONE
  64. vec3 norm_proj_refl = u_refl_plane.xyz * dot(normal, u_refl_plane.xyz);
  65. vec3 normal_offset = normal - norm_proj_refl;
  66. vec2 normal_offset_view = tsr9_transform_dir(view_tsr, normal_offset).xy;
  67. vec2 refl_coord = v_tex_pos_clip.xy/ v_tex_pos_clip.z;
  68. refl_coord += normal_offset_view * REFL_BUMP;
  69. vec3 reflect_color = GLSL_TEXTURE(u_plane_reflection, refl_coord).rgb;
  70. srgb_to_lin(reflect_color);
  71. reflect_color *= s_color;
  72. # else
  73. vec3 reflect_color = s_color;
  74. # endif
  75. return mix(base_color, reflect_color, metalness);
  76. }
  77. #endif
  78. #endif