particle_cube_base.shader 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. shader_type spatial;
  2. render_mode blend_mix,depth_draw_alpha_prepass,cull_back,unshaded;
  3. uniform vec4 col_a:hint_color;
  4. // how it work: lighting hapens in 2d-UV space, vertex coordinates calculated in fake-view-projection logic
  5. // rotationfixed to be face-camera, to see bilboard mode uncomment mtx= line in VERTEX function
  6. vec3 my_normalize3(vec3 v){
  7. float len = length(v);
  8. vec3 ret=vec3(0.);
  9. if(len==0.0)ret= vec3(1.0,0.0,0.0);
  10. else ret= v/len;
  11. return ret;
  12. }
  13. //both should work
  14. /*
  15. mat4 lookAt(vec3 target, vec3 eye, vec3 up) {
  16. vec3 zAxis = my_normalize3(target - eye);
  17. vec3 xAxis = my_normalize3(cross(up, zAxis));
  18. vec3 yAxis = cross(zAxis, xAxis);
  19. return mat4(
  20. vec4(xAxis, 0),
  21. vec4(yAxis, 0),
  22. vec4(zAxis, 0),
  23. vec4(-dot(xAxis, eye), -dot(yAxis, eye), -dot(zAxis, eye), 1));
  24. }
  25. */
  26. mat4 lookAt(vec3 from, vec3 to, vec3 tup) {
  27. vec3 forward = my_normalize3(from - to);
  28. if (length(forward.xz) <= 0.001) forward.x = 0.001;
  29. vec3 right = cross(normalize(tup), forward);
  30. right = my_normalize3(right);
  31. vec3 up = cross(forward, right);
  32. mat4 camToWorld = mat4(1.);
  33. camToWorld[0].xyz = right.xyz;
  34. camToWorld[1].xyz = up.xyz;
  35. camToWorld[2].xyz = forward.xyz;
  36. camToWorld[3].xyz = from.xyz;
  37. return camToWorld;
  38. }
  39. varying mat4 mtx;
  40. void vertex() {
  41. // bilboard project
  42. //mtx = 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]);
  43. // lookAt project, comment/uncomment
  44. vec3 cam_pos = CAMERA_MATRIX[3].xyz;
  45. mtx=lookAt(cam_pos,WORLD_MATRIX[3].xyz,vec3(0.,1.,0.));
  46. mtx[3].xyz=WORLD_MATRIX[3].xyz;
  47. MODELVIEW_MATRIX=INV_CAMERA_MATRIX*mtx;
  48. }
  49. float line( vec2 a, vec2 b, vec2 p)
  50. {
  51. vec2 aTob = b - a;
  52. vec2 aTop = p - a;
  53. float t = dot( aTop, aTob ) / dot( aTob, aTob);
  54. t = clamp( t, 0.0, 1.0);
  55. float d = length( p - (a + aTob * t) );
  56. d = (0.045) / max(d,0.001);
  57. d = pow(d, 7.0);
  58. return clamp( d, 0., 1.0 );
  59. }
  60. mat4 perspectiveMatrix(float fovYInRad, float aspectRatio)
  61. {
  62. float yScale = 1.0/tan(fovYInRad / 2.0);
  63. float xScale = yScale / aspectRatio;
  64. float zf = 100.0;
  65. float zn = 0.3;
  66. float z1 = zf/(zf-zn);
  67. float z2 = -zn*zf/(zf-zn);
  68. mat4 result = mat4(vec4(xScale, 0.0, 0.0, 0.0),
  69. vec4(0.0, yScale, 0.0, 0.0),
  70. vec4(0.0, 0.0, z1, z2),
  71. vec4(0.0, 0.0, -1.0, 0.0));
  72. return result;
  73. }
  74. mat4 translationMatrix(vec3 pos)
  75. {
  76. mat4 result =
  77. mat4(vec4(1.0, 0.0, 0.0, 0.0),
  78. vec4(0.0, 1.0, 0.0, 0.0),
  79. vec4(0.0, 0.0, 1.0, 0.0),
  80. vec4(pos.x, pos.y, pos.z, 1.0));
  81. return result;
  82. }
  83. void process_verts( out vec4 fragColor, in vec2 p,vec3 vtx, vec3 icol)
  84. {
  85. vec2 uv = p * 2.0 - 1.0;
  86. vec2 ouv=uv;
  87. uv.y=-uv.y;
  88. vec3 ccol=clamp(icol,0.,1.);
  89. uv *= 5.0;
  90. const float fovYInRad = (45.0/180.0) * 3.14159;
  91. const float vs = 10.0;
  92. vec4 verts [16];
  93. verts[0] = vec4( -vs, -vs, vs, 1.0 );
  94. verts[1] = vec4( -vs, vs, vs, 1.0 );
  95. verts[2] = vec4( vs, vs, vs, 1.0 );
  96. verts[3] = vec4( vs, -vs, vs, 1.0 );
  97. verts[4] = vec4( -vs, -vs, vs, 1.0 );
  98. verts[5] = vec4( -vs, vs, vs, 1.0 );
  99. verts[6] = vec4( -vs, vs, -vs, 1.0 );
  100. verts[7] = vec4( -vs, -vs, -vs, 1.0 );
  101. verts[8] = vec4( -vs, -vs, -vs, 1.0 );
  102. verts[9] = vec4( -vs, vs, -vs, 1.0 );
  103. verts[10] = vec4( vs, vs, -vs, 1.0 );
  104. verts[11] = vec4( vs, -vs, -vs, 1.0 );
  105. verts[12] = vec4( vs, -vs, vs, 1.0 );
  106. verts[13] = vec4( vs, vs, vs, 1.0 );
  107. verts[14] = vec4( vs, vs, -vs, 1.0 );
  108. verts[15] = vec4( vs, -vs, -vs, 1.0 );
  109. float moveX=0.;
  110. float moveY=0.;
  111. float moveZ=60.;
  112. vec3 pos = vec3( moveX, moveY, moveZ);
  113. //pos=pos-vtx*5.; //bad perspective fix
  114. mat4 tmtx=mtx;
  115. tmtx[3].xyz=vec3(0.);
  116. mat4 worldMat = translationMatrix(pos) *inverse(tmtx) ;
  117. mat4 perspective = perspectiveMatrix(fovYInRad, 1.);
  118. mat4 mvp = perspective * worldMat;
  119. float t = 0.0;
  120. for(int i = 0; i < 16; ++i)
  121. {
  122. vec4 startWorldVert = mvp * verts[i];
  123. vec4 endWorldVert;
  124. if( i+1 < 16)
  125. {
  126. endWorldVert = mvp * verts[i + 1];
  127. }
  128. else
  129. {
  130. endWorldVert = mvp * verts[i - 3];
  131. }
  132. if(i != 0 && mod(float(i+1), 4.0) == 0.0)
  133. {
  134. endWorldVert = mvp * verts[i - 3];
  135. }
  136. if((startWorldVert.w<=-1.001)&&(endWorldVert.w<=-1.001)){
  137. vec2 sp = startWorldVert.xy / startWorldVert.w;
  138. vec2 ep = endWorldVert.xy / endWorldVert.w;
  139. t += line( sp, ep, uv);
  140. }
  141. }
  142. vec3 fc = vec3( 0.0 );
  143. fc += icol* pow(t, 0.2);
  144. float a=(1.-dot(ouv*0.5,ouv*0.5))*(1.-smoothstep(0.7,1.,length(ouv)));
  145. fc*=a;
  146. fragColor = vec4( fc, clamp(pow(t, 0.2),0.,1.)*a );
  147. }
  148. // WARNING this shader trigger Nvidia bugs read https://github.com/godotengine/godot/issues/41109
  149. void fragment() {
  150. vec4 col=vec4(0.);
  151. //in particles instead of mtx[3].xyz-cam_pos can be used VERTEX
  152. vec3 cam_pos = CAMERA_MATRIX[3].xyz;
  153. process_verts(col,UV,mtx[3].xyz-cam_pos, col_a.rgb*2.);
  154. float fade_distance=length(mtx[3].xyz-cam_pos);//float fade_distance=VERTEX.z;
  155. float fade=clamp(smoothstep(0.25,.5,fade_distance),0.0,1.0);
  156. ALBEDO = max(col.rgb,col_a.rgb*2.)*fade;
  157. ALPHA=col.a;
  158. }