ForwardShadingParticlesSparks.ankiprog 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma anki technique ForwardLegacy vert pixel
  6. #include <AnKi/Shaders/ForwardShadingCommon.hlsl>
  7. #pragma anki struct AnKiLocalConstants
  8. #pragma anki member Vec3 m_diffColor 1.0 1.0 1.0
  9. #pragma anki member F32 m_roughness 0.9
  10. #pragma anki member F32 m_metallic 0.0
  11. #pragma anki member Vec3 m_initialEmission 0.0 0.0 0.0
  12. #pragma anki member Vec3 m_finalEmission 0.0 0.0 0.0
  13. #pragma anki struct_end
  14. struct VertIn
  15. {
  16. U32 m_svVertexId : SV_VERTEXID;
  17. U32 m_svInstanceId : SV_INSTANCEID;
  18. };
  19. struct VertOut
  20. {
  21. ANKI_RELAXED_PRECISION nointerpolation F32 m_lifeFactor : LIFE_FACTOR;
  22. nointerpolation U32 m_constantsOffset : CONSTANTS_OFFSET;
  23. Vec2 m_uv : TEXCOORD;
  24. Vec4 m_svPosition : SV_POSITION;
  25. };
  26. #if ANKI_VERTEX_SHADER
  27. VertOut main(VertIn input)
  28. {
  29. VertOut output;
  30. const GpuScenePerDraw instance = getGpuScenePerDraw();
  31. const GpuSceneParticleEmitter2 particles = SBUFF(g_particleEmitters2, instance.m_particleEmitterIndex);
  32. const GpuSceneMeshLod meshLod = SBUFF(g_meshLods, instance.m_meshLodIndex);
  33. const Vec3 localPos =
  34. g_unifiedGeom_R16G16B16A16_Unorm[meshLod.m_vertexOffsets[(U32)VertexStreamId::kPosition] + input.m_svVertexId] * meshLod.m_positionScale
  35. + meshLod.m_positionTranslation;
  36. U32 offset = particles.m_aliveParticleIndicesOffset + input.m_svInstanceId * sizeof(U32);
  37. const U32 particleId = BAB_LOAD(g_gpuScene, U32, offset);
  38. output.m_uv = g_unifiedGeom_R32G32_Sfloat[meshLod.m_vertexOffsets[(U32)VertexStreamId::kUv] + input.m_svVertexId];
  39. // Compute pos
  40. {
  41. offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kPosition] + particleId * sizeof(Vec3);
  42. const Vec3 particlePos = BAB_LOAD(g_gpuScene, Vec3, offset);
  43. offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kVelocity] + particleId * sizeof(Vec3);
  44. const Vec3 velocity = BAB_LOAD(g_gpuScene, Vec3, offset);
  45. offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kScale] + particleId * sizeof(Vec3);
  46. const Vec3 particleScale = BAB_LOAD(g_gpuScene, Vec3, offset);
  47. const Vec3 xAxis = normalize(-velocity);
  48. const Vec3 zAxis = normalize(g_globalConstants.m_cameraTransform.getColumn(2));
  49. const Vec3 yAxis = normalize(cross(zAxis, xAxis));
  50. Mat3 rot;
  51. rot.setColumns(xAxis, yAxis, zAxis);
  52. Vec3 worldPos = localPos;
  53. worldPos *= particleScale;
  54. worldPos = mul(rot, worldPos);
  55. worldPos += particlePos;
  56. output.m_svPosition = mul(g_globalConstants.m_viewProjectionMatrix, Vec4(worldPos, 1.0));
  57. }
  58. // Life factor
  59. offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kLifeFactor] + particleId * sizeof(F32);
  60. output.m_lifeFactor = BAB_LOAD(g_gpuScene, F32, offset);
  61. output.m_lifeFactor = saturate(output.m_lifeFactor);
  62. output.m_constantsOffset = instance.m_constantsOffset;
  63. return output;
  64. }
  65. #endif // ANKI_VERTEX_SHADER
  66. #if ANKI_PIXEL_SHADER
  67. # include <AnKi/Shaders/PackFunctions.hlsl>
  68. PixelOut main(VertOut input)
  69. {
  70. PixelOut output;
  71. const AnKiLocalConstants localConstants = loadAnKiLocalConstants(g_gpuScene, input.m_constantsOffset);
  72. const Vec2 ndc = uvToNdc(input.m_uv);
  73. F32 alpha = min(1.0, length(ndc));
  74. alpha = 1.0 - alpha;
  75. alpha = pow(alpha, 2.0);
  76. alpha *= 1.0 - input.m_lifeFactor;
  77. F32 emissionFactor = input.m_lifeFactor;
  78. // emissionFactor = sqrt(emissionFactor);
  79. emissionFactor *= 1.0 - alpha;
  80. const Vec3 emission = lerp(localConstants.m_initialEmission, localConstants.m_finalEmission, emissionFactor);
  81. particleAlpha(Vec4(emission, alpha), 1.0, 0.0, output);
  82. return output;
  83. }
  84. #endif // ANKI_PIXEL_SHADER