VS_InstancedIndirect.cginc 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
  2. struct IndirectShaderData
  3. {
  4. float4x4 PositionMatrix;
  5. float4x4 InversePositionMatrix;
  6. float4 ControlData;
  7. };
  8. #if defined(SHADER_API_GLCORE) || defined(SHADER_API_D3D11) || defined(SHADER_API_GLES3) || defined(SHADER_API_METAL) || defined(SHADER_API_VULKAN) || defined(SHADER_API_PSSL) || defined(SHADER_API_XBOXONE)
  9. StructuredBuffer<IndirectShaderData> IndirectShaderDataBuffer;
  10. StructuredBuffer<IndirectShaderData> VisibleShaderDataBuffer;
  11. #endif
  12. #endif
  13. void setupScale()
  14. {
  15. #ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
  16. #ifdef GPU_FRUSTUM_ON
  17. unity_ObjectToWorld = VisibleShaderDataBuffer[unity_InstanceID].PositionMatrix;
  18. unity_WorldToObject = VisibleShaderDataBuffer[unity_InstanceID].InversePositionMatrix;
  19. #else
  20. unity_ObjectToWorld = IndirectShaderDataBuffer[unity_InstanceID].PositionMatrix;
  21. unity_WorldToObject = IndirectShaderDataBuffer[unity_InstanceID].InversePositionMatrix;
  22. #endif
  23. #ifdef FAR_CULL_ON_PROCEDURAL_INSTANCING
  24. #define transformPosition mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz
  25. #define distanceToCamera length(transformPosition - _WorldSpaceCameraPos.xyz)
  26. float cull = 1.0 - saturate((distanceToCamera - _CullFarStart) / _CullFarDistance);
  27. unity_ObjectToWorld = mul(unity_ObjectToWorld, float4x4(cull, 0, 0, 0, 0, cull, 0, 0, 0, 0, cull, 0, 0, 0, 0, 1));
  28. #undef transformPosition
  29. #undef distanceToCamera
  30. #endif
  31. #endif
  32. }
  33. void setup()
  34. {
  35. #ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
  36. #ifdef GPU_FRUSTUM_ON
  37. unity_ObjectToWorld = VisibleShaderDataBuffer[unity_InstanceID].PositionMatrix;
  38. unity_WorldToObject = VisibleShaderDataBuffer[unity_InstanceID].InversePositionMatrix;
  39. #else
  40. unity_ObjectToWorld = IndirectShaderDataBuffer[unity_InstanceID].PositionMatrix;
  41. unity_WorldToObject = IndirectShaderDataBuffer[unity_InstanceID].InversePositionMatrix;
  42. #endif
  43. #endif
  44. }