ForwardShadingGenericTransparent.ankiprog 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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 TEXTURE 0 1
  6. #pragma anki mutator LIGHT 0 1
  7. #pragma anki technique ForwardLegacy vert pixel
  8. #pragma anki technique ForwardSwMeshletRendering vert pixel
  9. #pragma anki technique ForwardMeshShaders mesh pixel
  10. #include <AnKi/Shaders/ForwardShadingCommon.hlsl>
  11. #define SW_MESHLETS ANKI_TECHNIQUE_ForwardSwMeshletRendering
  12. #pragma anki struct AnKiLocalConstants
  13. #pragma anki member U32 m_texture
  14. #pragma anki member Vec4 m_colorScale
  15. #pragma anki member Vec4 m_colorBias
  16. #pragma anki struct_end
  17. struct VertIn
  18. {
  19. UVec4 m_instanceData : MISC0;
  20. U32 m_svVertexId : SV_VERTEXID;
  21. };
  22. struct VertOut
  23. {
  24. Vec2 m_uv : TEXCOORD;
  25. Vec3 m_worldPosition : WORLD_POSITION;
  26. Vec4 m_svPosition : SV_POSITION;
  27. nointerpolation U32 m_constantsOffset : CONSTANTS_OFFSET;
  28. };
  29. struct MeshPerVertOut
  30. {
  31. Vec4 m_svPosition : SV_POSITION;
  32. Vec2 m_uv : TEXCOORD;
  33. };
  34. struct MeshPerPrimitiveOut
  35. {
  36. ANKI_PER_PRIMITIVE_MEMBER U32 m_constantsOffset : UNIS_OFFSET;
  37. };
  38. // ===========================================================================
  39. // Vert =
  40. // ===========================================================================
  41. #if ANKI_VERTEX_SHADER
  42. VertOut main(VertIn input)
  43. {
  44. VertOut output;
  45. # if SW_MESHLETS
  46. const GpuSceneMeshletInstance instance = unpackGpuSceneMeshletInstance(input.m_instanceData);
  47. if(input.m_svVertexId >= (instance.m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit & ((1u << 7u) - 1u)) * 3u)
  48. {
  49. // Discard the primitive
  50. output = (VertOut)0;
  51. output.m_svPosition = kNaN;
  52. return output;
  53. }
  54. const MeshletGeometryDescriptor meshlet = g_meshletGeometryDescriptors[instance.m_meshletGeometryDescriptorIndex];
  55. const UnpackedMeshVertex vertex = loadVertex(meshlet, input.m_svVertexId, false);
  56. const U32 worldTransformsIndex = instance.m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit >> 7u;
  57. # else // SW_MESHLETS
  58. const GpuScenePerDraw instance = getGpuScenePerDraw();
  59. const GpuSceneMeshLod mesh = g_meshLods[instance.m_meshLodIndex];
  60. const U32 worldTransformsIndex = instance.m_worldTransformsIndex;
  61. const UnpackedMeshVertex vertex = loadVertex(mesh, input.m_svVertexId, false);
  62. # endif // SW_MESHLETS
  63. const U32 constantsOffset = instance.m_constantsOffset;
  64. const Mat3x4 worldTransform = g_transforms[worldTransformsIndex];
  65. output.m_worldPosition = mul(worldTransform, Vec4(vertex.m_position, 1.0));
  66. output.m_svPosition = mul(g_globalConstants.m_viewProjectionMatrix, Vec4(output.m_worldPosition, 1.0));
  67. output.m_uv = vertex.m_uv;
  68. output.m_constantsOffset = constantsOffset;
  69. return output;
  70. }
  71. #endif // ANKI_VERTEX_SHADER
  72. // ===========================================================================
  73. // Mesh =
  74. // ===========================================================================
  75. #if ANKI_MESH_SHADER
  76. [numthreads(ANKI_MESH_SHADER_THREADGROUP_SIZE, 1, 1)] [outputtopology("triangle")] void
  77. main(U32 svGroupId : SV_GROUPID, U32 svGroupIndex : SV_GROUPINDEX, out vertices MeshPerVertOut verts[kMaxVerticesPerMeshlet],
  78. out primitives MeshPerPrimitiveOut primitives[kMaxPrimitivesPerMeshlet], out indices UVec3 indices[kMaxPrimitivesPerMeshlet])
  79. {
  80. const U32 instanceIdx = g_firstMeshlet[g_consts.m_bucketIndex] + svGroupId;
  81. const GpuSceneMeshletInstance instance = g_meshletInstances[instanceIdx];
  82. const U32 constantsOffset = instance.m_constantsOffset;
  83. const U32 worldTransformsIndex = instance.m_worldTransformsIndex_25bit_meshletPrimitiveCount_7bit >> 7u;
  84. const MeshletGeometryDescriptor meshlet = g_meshletGeometryDescriptors[instance.m_meshletGeometryDescriptorIndex];
  85. const U32 primCount = meshlet.m_primitiveCount;
  86. const U32 vertCount = meshlet.m_vertexCount;
  87. SetMeshOutputCounts(vertCount, primCount);
  88. // Write the verts
  89. const U32 vertLoopCount = kMaxVerticesPerMeshlet / ANKI_MESH_SHADER_THREADGROUP_SIZE;
  90. [unroll] for(U32 l = 0; l < vertLoopCount; ++l)
  91. {
  92. const U32 idx = l * ANKI_MESH_SHADER_THREADGROUP_SIZE + svGroupIndex;
  93. if(idx < vertCount)
  94. {
  95. MeshPerVertOut output;
  96. const UnpackedMeshVertex vert = loadVertexLocalIndex(meshlet, idx, false);
  97. const Mat3x4 worldTransform = g_transforms[worldTransformsIndex];
  98. const Vec3 worldPos = mul(worldTransform, Vec4(vert.m_position, 1.0));
  99. output.m_svPosition = mul(g_globalConstants.m_viewProjectionMatrix, Vec4(worldPos, 1.0f));
  100. output.m_uv = vert.m_uv;
  101. verts[idx] = output;
  102. }
  103. }
  104. // Write the primitive data
  105. const U32 primLoopCount = (kMaxPrimitivesPerMeshlet + ANKI_MESH_SHADER_THREADGROUP_SIZE - 1u) / ANKI_MESH_SHADER_THREADGROUP_SIZE;
  106. [unroll] for(U32 l = 0; l < primLoopCount; ++l)
  107. {
  108. const U32 idx = l * ANKI_MESH_SHADER_THREADGROUP_SIZE + svGroupIndex;
  109. if(idx < primCount)
  110. {
  111. const UVec3 prim = g_unifiedGeom_R8G8B8A8_Uint[meshlet.m_firstPrimitive + idx].xyz;
  112. indices[idx] = prim;
  113. primitives[idx].m_constantsOffset = constantsOffset;
  114. }
  115. }
  116. }
  117. #endif // ANKI_MESH_SHADER
  118. // ===========================================================================
  119. // Pixel =
  120. // ===========================================================================
  121. #if ANKI_PIXEL_SHADER
  122. PixelOut main(VertOut input)
  123. {
  124. ANKI_MAYBE_UNUSED(input);
  125. PixelOut output;
  126. const AnKiLocalConstants localConstants = loadAnKiLocalConstants(g_gpuScene, WaveReadLaneFirst(input.m_constantsOffset));
  127. output.m_color = Vec4(1.0, 1.0, 1.0, 1.0);
  128. # if TEXTURE == 1
  129. output.m_color = getBindlessTexture2DVec4(localConstants.m_texture).Sample(g_globalSampler, input.m_uv);
  130. # endif
  131. # if LIGHT == 1
  132. output.m_color.rgb = computeLightColorLow(output.m_color.rgb, input.m_worldPosition, input.m_svPosition);
  133. # endif
  134. output.m_color = output.m_color * localConstants.m_colorScale + localConstants.m_colorBias;
  135. return output;
  136. }
  137. #endif // ANKI_PIXEL_SHADER