ForwardShadingParticles.ankiprog 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright (C) 2009-2022, 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 ANKI_TECHNIQUE 3
  6. #pragma anki mutator ANIMATED_TEXTURE 0 1
  7. #pragma anki mutator LIGHT 0 1
  8. #include <AnKi/Shaders/ForwardShadingCommon.glsl>
  9. #pragma anki reflect AnKiLocalUniforms
  10. #pragma anki struct AnKiLocalUniforms
  11. #pragma anki member F32 m_animationPeriod if ANIMATED_TEXTURE is 1
  12. #pragma anki member ANKI_RP Vec4 m_colorScale
  13. #pragma anki member ANKI_RP Vec4 m_colorBias
  14. #pragma anki struct end
  15. layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_GLOBAL_UNIFORMS) uniform b_ankiGlobalUniforms
  16. {
  17. MaterialGlobalUniforms u_ankiGlobals;
  18. };
  19. layout(set = MATERIAL_SET_GLOBAL, binding = MATERIAL_BINDING_TRILINEAR_REPEAT_SAMPLER) uniform sampler u_globalSampler;
  20. layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_LOCAL_UNIFORMS, std430) buffer b_localUniforms
  21. {
  22. U32 u_localUniforms[];
  23. };
  24. layout(set = MATERIAL_SET_LOCAL, binding = MATERIAL_BINDING_RENDERABLE_GPU_VIEW) uniform b_renderableGpuViews
  25. {
  26. RenderableGpuView u_renderableGpuViews[1];
  27. };
  28. #if ANIMATED_TEXTURE == 0
  29. # pragma anki reflect u_diffuseMap
  30. layout(set = MATERIAL_SET_LOCAL,
  31. binding = MATERIAL_BINDING_FIRST_NON_STANDARD_LOCAL) uniform ANKI_RP texture2D u_diffuseMap;
  32. #endif
  33. #if ANIMATED_TEXTURE == 1
  34. # pragma anki reflect u_diffuseMapArr
  35. layout(set = MATERIAL_SET_LOCAL,
  36. binding = MATERIAL_BINDING_FIRST_NON_STANDARD_LOCAL) uniform ANKI_RP texture2DArray u_diffuseMapArr;
  37. #endif
  38. #pragma anki start vert
  39. layout(location = VERTEX_ATTRIBUTE_ID_SCALE) in F32 in_scale;
  40. layout(location = VERTEX_ATTRIBUTE_ID_ALPHA) in F32 in_alpha;
  41. layout(location = 0) flat out ANKI_RP F32 out_alpha;
  42. layout(location = 1) out Vec2 out_uv;
  43. layout(location = 2) out Vec3 out_worldPos;
  44. void main()
  45. {
  46. out_uv = Vec2(gl_VertexID & 1, gl_VertexID >> 1);
  47. out_worldPos = u_ankiGlobals.m_cameraTransform * Vec4((out_uv - 0.5) * in_scale, 0.0, 0.0) + in_position;
  48. gl_Position = u_ankiGlobals.m_viewProjectionMatrix
  49. * Vec4(u_renderableGpuViews[0].m_worldTransform * Vec4(out_worldPos, 1.0), 1.0);
  50. out_alpha = in_alpha;
  51. }
  52. #pragma anki end
  53. #pragma anki start frag
  54. layout(location = 0) flat in ANKI_RP F32 in_alpha;
  55. layout(location = 1) in Vec2 in_uv;
  56. layout(location = 2) in Vec3 in_worldPos;
  57. void main()
  58. {
  59. const AnKiLocalUniforms localUniforms = loadAnKiLocalUniforms(u_localUniforms, 0u);
  60. #if ANIMATED_TEXTURE == 1
  61. ANKI_RP Vec4 texCol = readAnimatedTextureRgba(u_diffuseMapArr, u_globalSampler, localUniforms.m_animationPeriod,
  62. in_uv, u_clusteredShading.m_time);
  63. #else
  64. ANKI_RP Vec4 texCol = texture(u_diffuseMap, u_globalSampler, in_uv);
  65. #endif
  66. #if LIGHT
  67. texCol.rgb = computeLightColorLow(texCol.rgb, in_worldPos);
  68. #endif
  69. ANKI_RP Vec4 colScale = localUniforms.m_colorScale;
  70. colScale.a *= in_alpha;
  71. particleAlpha(texCol, colScale, localUniforms.m_colorBias);
  72. }
  73. #pragma anki end