Instanced.azsl 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include <Atom/Features/SrgSemantics.azsli>
  2. #include <viewsrg.srgi>
  3. struct CubeTransform
  4. {
  5. float4 m_worldPosition; //XYZ world pos; ignore W
  6. float4 m_rotation; //Quaternion
  7. };
  8. struct PerChunk
  9. {
  10. uint m_chunkIndex;
  11. };
  12. // RootConstantBuffer<PerChunk> g_RootConstants; // we don't support RootConstantBuffer
  13. ShaderResourceGroup GlobalInstancedSrg : SRG_PerObject
  14. {
  15. StructuredBuffer<CubeTransform> g_CubeTransforms;
  16. }
  17. struct VSInput
  18. {
  19. float3 m_position : POSITION;
  20. float4 m_color : COLOR0;
  21. uint m_instanceId : SV_InstanceID;
  22. };
  23. struct VSOutput
  24. {
  25. float4 m_position : SV_Position;
  26. float4 m_color : COLOR0;
  27. };
  28. float3 RotatePositionByQuaternion(float3 pos, float4 quat)
  29. {
  30. float3 t = 2 * cross(quat.xyz, pos);
  31. return pos + quat.w * t + cross(quat.xyz, t);
  32. }
  33. VSOutput InstancedVS(VSInput vsInput)
  34. {
  35. VSOutput OUT;
  36. uint chunkIndex = 0;
  37. CubeTransform transform = GlobalInstancedSrg::g_CubeTransforms[vsInput.m_instanceId + chunkIndex];
  38. float3 objectPos = RotatePositionByQuaternion(vsInput.m_position, transform.m_rotation);
  39. float3 worldPosition = objectPos + transform.m_worldPosition.xyz;
  40. OUT.m_position = mul(float4(worldPosition, 1.0), ViewSrg::m_worldToClipMatrix);
  41. OUT.m_color = vsInput.m_color;
  42. return OUT;
  43. }
  44. struct PSOutput
  45. {
  46. float4 m_color : SV_Target0;
  47. };
  48. PSOutput InstancedPS(VSOutput vsOutput)
  49. {
  50. PSOutput OUT;
  51. OUT.m_color = vsOutput.m_color;
  52. return OUT;
  53. }