pine_instanced.vert 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #version 330 core
  2. layout(location = 0) in vec3 aPos;
  3. layout(location = 1) in vec2 aTexCoord;
  4. layout(location = 2) in vec3 aNormal;
  5. layout(location = 3) in vec4 aPosScale;
  6. layout(location = 4) in vec4 aColorSway;
  7. layout(location = 5) in vec4 aRotation;
  8. uniform mat4 uViewProj;
  9. uniform float uTime;
  10. uniform float uWindStrength;
  11. uniform float uWindSpeed;
  12. out vec3 vWorldPos;
  13. out vec3 vNormal;
  14. out vec3 vColor;
  15. out vec2 vTexCoord;
  16. out float vFoliageMask;
  17. out float vNeedleSeed;
  18. out float vBarkSeed;
  19. void main() {
  20. const float TWO_PI = 6.2831853;
  21. float scale = aPosScale.w;
  22. vec3 worldPos = aPosScale.xyz;
  23. float swayPhase = aColorSway.a;
  24. float rotation = aRotation.x;
  25. float silhouetteSeed = aRotation.y;
  26. float needleSeed = aRotation.z;
  27. float barkSeed = aRotation.w;
  28. vec3 modelPos = aPos;
  29. float foliageMask = smoothstep(0.34, 0.42, aTexCoord.y);
  30. float tipMask = smoothstep(0.88, 1.02, aTexCoord.y);
  31. float angle = aTexCoord.x * TWO_PI;
  32. float irregularBase = sin(angle * 3.0 + silhouetteSeed * TWO_PI);
  33. float irregularFine = sin(angle * 5.0 + silhouetteSeed * TWO_PI * 2.0);
  34. float irregular = (irregularBase * 0.11 + irregularFine * 0.05) *
  35. foliageMask * (1.0 - tipMask * 0.6);
  36. modelPos.xz *= (1.0 + irregular);
  37. float droop = foliageMask * (1.0 - tipMask) * 0.08;
  38. modelPos.y -= droop;
  39. float heightFactor = clamp(modelPos.y, 0.0, 1.1);
  40. vec3 localPos = modelPos * scale;
  41. float sway = sin(uTime * uWindSpeed * 0.5 + swayPhase) * uWindStrength * 0.8 *
  42. heightFactor * heightFactor;
  43. float swayInfluence = mix(0.04, 0.12, foliageMask);
  44. localPos.x += sway * swayInfluence;
  45. localPos.y -= sway * 0.02 * foliageMask;
  46. vec3 localNormal = aNormal;
  47. if (foliageMask > 0.0) {
  48. float normalScale = 1.0 + irregular;
  49. localNormal = normalize(vec3(localNormal.x * normalScale,
  50. localNormal.y - foliageMask * 0.2,
  51. localNormal.z * normalScale));
  52. }
  53. float cosR = cos(rotation);
  54. float sinR = sin(rotation);
  55. mat2 rot = mat2(cosR, -sinR, sinR, cosR);
  56. vec2 rotatedXZ = rot * localPos.xz;
  57. localPos = vec3(rotatedXZ.x, localPos.y, rotatedXZ.y);
  58. vec2 rotatedNormalXZ = rot * localNormal.xz;
  59. vec3 finalNormal =
  60. normalize(vec3(rotatedNormalXZ.x, localNormal.y, rotatedNormalXZ.y));
  61. vWorldPos = localPos + worldPos;
  62. vNormal = finalNormal;
  63. vColor = aColorSway.rgb;
  64. vTexCoord = aTexCoord;
  65. vFoliageMask = foliageMask;
  66. vNeedleSeed = needleSeed;
  67. vBarkSeed = barkSeed;
  68. gl_Position = uViewProj * vec4(vWorldPos, 1.0);
  69. }