ForwardShadingParticlesGass.ankiprog 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 mutator ANIMATED_TEXTURE 0 1
  6. #pragma anki mutator LIGHT 0 1
  7. #pragma anki technique ForwardLegacy vert pixel
  8. #include <AnKi/Shaders/ForwardShadingCommon.hlsl>
  9. struct VertIn
  10. {
  11. U32 m_svVertexId : SV_VERTEXID;
  12. U32 m_svInstanceId : SV_INSTANCEID;
  13. };
  14. struct VertOut
  15. {
  16. nointerpolation U32 m_constantsOffset : UNIS_OFFSET;
  17. ANKI_RELAXED_PRECISION nointerpolation F32 m_alpha : ALPHA;
  18. Vec2 m_uv : TEXCOORD;
  19. Vec3 m_worldPos : WORLD_POS;
  20. Vec4 m_svPosition : SV_POSITION;
  21. };
  22. #pragma anki struct AnKiLocalConstants
  23. #pragma anki member F32 m_textureAnimationPeriod 0.0
  24. #pragma anki member Vec4 m_colorScale 1.0 1.0 1.0 1.0
  25. #pragma anki member Vec4 m_colorBias 0.0 0.0 0.0 0.0
  26. #pragma anki member U32 m_diffuseTex 0
  27. #pragma anki struct_end
  28. #if ANKI_VERTEX_SHADER
  29. VertOut main(VertIn input)
  30. {
  31. const GpuScenePerDraw instance = getGpuScenePerDraw();
  32. const GpuSceneParticleEmitter2 particles = SBUFF(g_particleEmitters2, instance.m_particleEmitterIndex);
  33. const GpuSceneMeshLod meshLod = SBUFF(g_meshLods, instance.m_meshLodIndex);
  34. U32 offset = particles.m_aliveParticleIndicesOffset + input.m_svInstanceId * sizeof(U32);
  35. const U32 particleId = BAB_LOAD(g_gpuScene, U32, offset);
  36. offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kPosition] + particleId * sizeof(Vec3);
  37. const Vec3 particlePos = BAB_LOAD(g_gpuScene, Vec3, offset);
  38. offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kScale] + particleId * sizeof(Vec3);
  39. const F32 particleScale = BAB_LOAD(g_gpuScene, Vec3, offset).x;
  40. offset = particles.m_particleStateSteamOffsets[(U32)ParticleProperty::kUserDefined1] + particleId * sizeof(Vec4);
  41. const F32 particleAlpha = BAB_LOAD(g_gpuScene, Vec4, offset).z;
  42. VertOut output;
  43. output.m_uv = g_unifiedGeom_R32G32_Sfloat[meshLod.m_vertexOffsets[(U32)VertexStreamId::kUv] + input.m_svVertexId];
  44. const Vec3 localPos =
  45. g_unifiedGeom_R16G16B16A16_Unorm[meshLod.m_vertexOffsets[(U32)VertexStreamId::kPosition] + input.m_svVertexId] * meshLod.m_positionScale
  46. + meshLod.m_positionTranslation;
  47. // Apply the particle scale, rotate the mesh to face the camera (billboard) and finally apply the particle position
  48. output.m_worldPos = mul(g_globalConstants.m_cameraTransform, Vec4(localPos * particleScale, 0.0)) + particlePos;
  49. output.m_svPosition = mul(g_globalConstants.m_viewProjectionMatrix, Vec4(output.m_worldPos, 1.0));
  50. output.m_alpha = particleAlpha;
  51. output.m_constantsOffset = instance.m_constantsOffset;
  52. return output;
  53. }
  54. #endif // ANKI_VERTEX_SHADER
  55. #if ANKI_PIXEL_SHADER
  56. PixelOut main(VertOut input)
  57. {
  58. PixelOut output = (PixelOut)0;
  59. const AnKiLocalConstants localConstants = loadAnKiLocalConstants(g_gpuScene, WaveReadLaneFirst(input.m_constantsOffset));
  60. # if ANIMATED_TEXTURE == 1
  61. Vec4 texCol = readAnimatedTextureRgba(getBindlessTexture2DArrayVec4(localConstants.m_diffuseTex), g_globalSampler,
  62. localConstants.m_textureAnimationPeriod, input.m_uv, g_globalRendererConstants.m_time);
  63. # else
  64. Vec4 texCol = getBindlessTexture2DVec4(localConstants.m_diffuseTex).Sample(g_globalSampler, input.m_uv);
  65. # endif
  66. # if LIGHT
  67. texCol.rgb = computeLightColorLow(texCol.rgb, input.m_worldPos, input.m_svPosition);
  68. # endif
  69. Vec4 colScale = localConstants.m_colorScale;
  70. colScale.a *= input.m_alpha;
  71. particleAlpha(texCol, colScale, localConstants.m_colorBias, output);
  72. return output;
  73. }
  74. #endif // ANKI_PIXEL_SHADER