firecamp.vert 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #version 330 core
  2. layout(location = 0) in vec3 aPos;
  3. layout(location = 1) in vec2 aTexCoord;
  4. layout(location = 3) in vec4 i_posIntensity;
  5. layout(location = 4) in vec4 i_radiusPhase;
  6. uniform mat4 u_viewProj;
  7. uniform float u_time;
  8. uniform float u_flickerSpeed;
  9. uniform float u_flickerAmount;
  10. uniform vec3 u_cameraRight;
  11. uniform vec3 u_cameraForward;
  12. out vec2 TexCoord;
  13. out float Intensity;
  14. out float FlamePhase;
  15. out float FlameHeight;
  16. void main() {
  17. vec3 campPos = i_posIntensity.xyz;
  18. float intensity = i_posIntensity.w;
  19. float phase = i_radiusPhase.y;
  20. float radius = i_radiusPhase.x;
  21. vec3 rightVec = normalize(vec3(u_cameraRight.x, 0.0, u_cameraRight.z));
  22. if (length(rightVec) < 1e-4)
  23. rightVec = vec3(1.0, 0.0, 0.0);
  24. vec3 forwardVec = normalize(vec3(u_cameraForward.x, 0.0, u_cameraForward.z));
  25. if (length(forwardVec) < 1e-4)
  26. forwardVec = normalize(vec3(-rightVec.z, 0.0, rightVec.x));
  27. vec3 upVec = vec3(0.0, 1.0, 0.0);
  28. float planeId = floor(aPos.z + 0.5);
  29. float angle = planeId * 2.0943951;
  30. float c = cos(angle);
  31. float s = sin(angle);
  32. vec3 horizontalAxis = normalize(rightVec * c + forwardVec * s);
  33. if (length(horizontalAxis) < 1e-4)
  34. horizontalAxis = rightVec;
  35. float intensityScale = clamp(intensity, 0.65, 1.4);
  36. float heightT = clamp(aTexCoord.y, 0.0, 1.0);
  37. float widthBase = clamp(radius * 0.18 * intensityScale, 0.55, 0.95);
  38. float widthScale = mix(widthBase, widthBase * 0.35, heightT);
  39. float heightScale = clamp(radius * 0.24 * intensityScale, 0.55, 1.05);
  40. float flickerOffset =
  41. sin(u_time * u_flickerSpeed + phase) * (u_flickerAmount * 0.55);
  42. float sway =
  43. sin(u_time * (u_flickerSpeed * 1.05) + phase * 2.1 + heightT * 2.7);
  44. vec3 wobbleOffset = horizontalAxis * (sway * u_flickerAmount * radius *
  45. (0.18 + heightT * 0.35));
  46. vec3 localOffset = horizontalAxis * (aPos.x * widthScale) +
  47. upVec * (aPos.y * heightScale * (0.85 + heightT * 0.25));
  48. float taper = mix(0.0, widthBase * 0.25, heightT * heightT);
  49. localOffset += horizontalAxis * (-aPos.x * taper);
  50. float baseLift = radius * 0.02 + intensity * 0.04;
  51. vec3 pos =
  52. campPos + localOffset + wobbleOffset + upVec * (flickerOffset + baseLift);
  53. gl_Position = u_viewProj * vec4(pos, 1.0);
  54. TexCoord = aTexCoord;
  55. Intensity = intensity;
  56. FlamePhase = phase;
  57. FlameHeight = heightT;
  58. }