p4.shader 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. shader_type spatial;
  2. render_mode blend_mix,depth_draw_opaque, cull_back,diffuse_burley,specular_schlick_ggx,unshaded,shadows_disabled;
  3. uniform vec3 dir_angle;
  4. uniform sampler2D iChannel0;
  5. uniform float iTime;
  6. //sky panorama from https://opengameart.org/content/ulukais-space-skyboxes
  7. float hash(in vec3 p)
  8. {
  9. return fract(sin(dot(p,
  10. vec3(12.6547, 765.3648, 78.653)))*43749.535);
  11. }
  12. float noise3(in vec3 p)
  13. {
  14. vec3 pi = floor(p);
  15. vec3 pf = fract(p);
  16. pf = pf*pf*(3.-2.*pf);
  17. float a = hash(pi + vec3(0., 0., 0.));
  18. float b = hash(pi + vec3(1., 0., 0.));
  19. float c = hash(pi + vec3(0., 1., 0.));
  20. float d = hash(pi + vec3(1., 1., 0.));
  21. float e = hash(pi + vec3(0., 0., 1.));
  22. float f = hash(pi + vec3(1., 0., 1.));
  23. float g = hash(pi + vec3(0., 1., 1.));
  24. float h = hash(pi + vec3(1., 1., 1.));
  25. return mix(mix(mix(a,b,pf.x),mix(c,d,pf.x),pf.y),
  26. mix(mix(e,f,pf.x),mix(g,h,pf.x),pf.y), pf.z);
  27. }
  28. float fbm3(vec3 rd) {
  29. float f = .5*noise3(rd);
  30. vec3 off = vec3(0.01, 0.01, 0.01);
  31. f += .25*noise3(rd*2.02 + off);
  32. f += .125*noise3(rd*4.01 + off);
  33. f += .065*noise3(rd*8.03 + off);
  34. f += .0325*noise3(rd*16.012 + off);
  35. return f;
  36. }
  37. vec2 uv_sphere(vec3 v)
  38. {
  39. float pi = 3.1415926536;
  40. return vec2(0.5 + atan(v.z, v.x) / (2.0 * pi), acos(v.y) / pi);
  41. }
  42. vec3 sky(in vec3 rd)
  43. {
  44. vec3 tcol=vec3(0.);
  45. tcol=texture(iChannel0,uv_sphere(rd)).rgb;
  46. vec3 col=vec3(0.);
  47. vec3 sunLight = -normalize(dir_angle);
  48. vec3 sunColour = vec3(1.0, .58, .39)*3.;
  49. float sunAmount = max( dot( rd, sunLight), 0.0 );
  50. vec3 sun = sunColour * min(pow(sunAmount, 800.0)*1.5, .4);
  51. rd*=4.;
  52. float f = fbm3(rd);
  53. float tt = 0.1*iTime;
  54. float f2 = fbm3(rd+2.*vec3(cos(f) + cos(tt), sin(f)+sin(tt),cos(f) + cos(tt)) );
  55. vec3 sky = vec3(.1,0.1,0.9);
  56. //noise colors generated base on next lines and col.r/g/b after
  57. vec3 col1 = mix(vec3(1.,1.,0.), vec3(1.,0.,1.), f);
  58. vec3 col2 = mix(sky, vec3(1.,1.,1.),f2);
  59. col += mix(col2, col1, f*f2);
  60. col = mix(tcol, col, 2.*( col.r*col.g));
  61. col += sun*(4.*(1.-col.g)*exp(-col.g*4.));
  62. col = mix(col, sun, clamp(4.*(1.-col.g-col.r)*exp((-col.g-col.r)*4.), 0.,1.));
  63. col=clamp(col*col,0.,1.);
  64. col=(tcol+tcol*tcol+col-tcol*col*0.5);
  65. return clamp(col,0.,1.);
  66. }
  67. void fragment() {
  68. vec3 rd=normalize(((CAMERA_MATRIX*vec4(normalize(-VERTEX),0.0)).xyz));
  69. rd=-rd;
  70. vec3 sky_col=sky(rd);
  71. ALBEDO=sky_col;
  72. //ALBEDO=ALBEDO*ALBEDO; //to use in Godot GLES3 add this color correction
  73. }