particle_cloud_base.shader 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. shader_type spatial;
  2. render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_toon,specular_schlick_ggx,shadows_disabled; //ambient_light_disabled
  3. uniform bool use_occ=false;
  4. uniform bool cell_shading=false;
  5. uniform bool fix_perspective=false;
  6. uniform bool use_light_color=true;
  7. uniform vec4 object_color : hint_color = vec4(0.5,0.5,0.5,1.0);
  8. uniform vec4 base_light_color : hint_color = vec4(1.0,1.0,1.0,1.0);
  9. uniform vec4 shade_color : hint_color = vec4(0.05,0.05,0.05,1.);
  10. uniform float shade_threshold : hint_range(-1.0, 1.0, 0.001) = 0.1;
  11. uniform float shade_softness : hint_range(0.0, 1.0, 0.001) = 0.02;
  12. varying vec3 spos;
  13. varying vec3 roc;
  14. varying float sp_size;
  15. // fix black color
  16. // t2=max(t2,0.001)
  17. void vertex() {
  18. //MODELVIEW_MATRIX = INV_CAMERA_MATRIX * mat4(CAMERA_MATRIX[0],CAMERA_MATRIX[1],CAMERA_MATRIX[2],WORLD_MATRIX[3]);
  19. mat4 mat_world = mat4(normalize(CAMERA_MATRIX[0])*length(WORLD_MATRIX[0]),normalize(CAMERA_MATRIX[1])*length(WORLD_MATRIX[0]),normalize(CAMERA_MATRIX[2])*length(WORLD_MATRIX[2]),WORLD_MATRIX[3]);
  20. float ts=1.;
  21. MODELVIEW_MATRIX = INV_CAMERA_MATRIX * mat_world;
  22. spos=mat_world[3].xyz;
  23. sp_size=2./max(length(WORLD_MATRIX[0].xyz),0.0001);
  24. roc=CAMERA_MATRIX[3].xyz*sp_size;
  25. if(fix_perspective)
  26. //VERTEX*=clamp(length(spos-CAMERA_MATRIX[3].xyz)/2.,0.,1.); //correct proportion fix on zoom
  27. VERTEX*=clamp(length(spos-CAMERA_MATRIX[3].xyz)/(2./sp_size),0.,1.); //not correct proportion fix on zoom
  28. }
  29. float cell_shade(vec3 nor, vec3 light)
  30. {
  31. float NdotL = dot(nor, light);
  32. float is_lit = step(shade_threshold, NdotL);
  33. float shade_value = smoothstep(shade_threshold - shade_softness ,shade_threshold + shade_softness, NdotL);
  34. //diffuse = mix(shade, base, shade_value);
  35. return shade_value;
  36. }
  37. // The MIT License
  38. // Copyright © 2014 Inigo Quilez
  39. // https://iquilezles.org/www/articles/intersectors/intersectors.htm
  40. float sphIntersect( in vec3 ro, in vec3 rd, in vec4 sph )
  41. {
  42. vec3 oc = ro - sph.xyz;
  43. float b = dot( oc, rd );
  44. float c = dot( oc, oc ) - sph.w*sph.w;
  45. float h = b*b - c;
  46. if( h<0.0 ) return -1.0;
  47. return -b - sqrt( h );
  48. }
  49. vec3 sphNormal( in vec3 pos, in vec4 sph )
  50. {
  51. return normalize(pos-sph.xyz);
  52. }
  53. vec4 sph_img( vec3 rd , vec3 lght, vec3 ro, vec3 sp, float sp_sz,vec3 bcol)
  54. {
  55. vec4 sph = vec4( sp, sp_sz);
  56. vec3 lig=lght;
  57. vec3 col = vec3(0.0);
  58. float tmin = 1e10;
  59. vec3 nor=vec3(0.);
  60. float occ = 1.0;
  61. float a=0.;
  62. float t2 = sphIntersect( ro, rd, sph );
  63. t2=max(t2,0.001); //to fix black color
  64. if( t2>0.0 && t2<tmin )
  65. {
  66. tmin = t2;
  67. vec3 pos = ro + t2*rd;
  68. nor = sphNormal( pos, sph );
  69. occ = 0.5 + 0.5*nor.y;
  70. }
  71. if( tmin<1000.0 )
  72. {
  73. vec3 pos = ro + tmin*rd;
  74. col = vec3(1.0);
  75. a=1.;
  76. float shade_value=0.;
  77. if(!cell_shading)
  78. shade_value = clamp( dot(nor,lig), 0.0, 1.0 ); //base shadow
  79. else
  80. shade_value=cell_shade(nor,lig); //cell
  81. if(use_occ)shade_value+=0.05*occ;
  82. col = mix(shade_color.rgb, bcol, shade_value);
  83. //col *= exp( -0.05*tmin );
  84. }
  85. //col=clamp(col,0.,1.);
  86. col = sqrt(col);
  87. return vec4(col, a );
  88. }
  89. void light(){
  90. vec3 rd=normalize(((CAMERA_MATRIX) * vec4(normalize(-VIEW), 0.0)).xyz);
  91. //DIFFUSE_LIGHT=vec3(0.);
  92. //SPECULAR_LIGHT=vec3(0.);
  93. vec3 lgt=normalize(((CAMERA_MATRIX) * vec4(normalize(LIGHT), 0.0)).xyz);
  94. //proportion fix on zoom
  95. vec4 col=vec4(0.);
  96. vec3 lc=base_light_color.rgb;
  97. if(use_light_color){
  98. lc=LIGHT_COLOR;
  99. }
  100. if(fix_perspective)
  101. //correct
  102. //col=sph_img(normalize(rd),normalize( lgt ), roc,spos*sp_size, 1.-0.999*(1.-min(length(spos-CAMERA_MATRIX[3].xyz)/2.,1.)),lc);
  103. //not correct
  104. col=sph_img(normalize(rd),normalize( lgt ), roc,spos*sp_size, 1.-0.999*(1.-min(length(spos-CAMERA_MATRIX[3].xyz)/(2./sp_size),1.)),lc);
  105. else
  106. col=sph_img(normalize(rd),normalize( lgt ), roc,spos*sp_size, 1.,lc); //no fix
  107. SPECULAR_LIGHT+=col.rgb*ATTENUATION*ALBEDO;
  108. DIFFUSE_LIGHT+=col.rgb*ATTENUATION*ALBEDO;
  109. //ALPHA=col.w;
  110. }
  111. void fragment() {
  112. ALBEDO=object_color.rgb;
  113. METALLIC = 0.;
  114. ROUGHNESS = 0.9;
  115. SPECULAR = 0.5;
  116. }