Brak opisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ObjectMotionVectors.hlsl 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #ifndef UNIVERSAL_OBJECT_MOTION_VECTORS_INCLUDED
  2. #define UNIVERSAL_OBJECT_MOTION_VECTORS_INCLUDED
  3. #pragma target 3.5
  4. #pragma vertex vert
  5. #pragma fragment frag
  6. //--------------------------------------
  7. // GPU Instancing
  8. #pragma multi_compile_instancing
  9. #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
  10. //-------------------------------------
  11. // Other pragmas
  12. #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
  13. // -------------------------------------
  14. // Includes
  15. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  16. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityInput.hlsl"
  17. #if defined(LOD_FADE_CROSSFADE)
  18. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl"
  19. #endif
  20. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/MotionVectorsCommon.hlsl"
  21. // -------------------------------------
  22. // Structs
  23. struct Attributes
  24. {
  25. float4 position : POSITION;
  26. #if _ALPHATEST_ON
  27. float2 uv : TEXCOORD0;
  28. #endif
  29. float3 positionOld : TEXCOORD4;
  30. #if _ADD_PRECOMPUTED_VELOCITY
  31. float3 alembicMotionVector : TEXCOORD5;
  32. #endif
  33. UNITY_VERTEX_INPUT_INSTANCE_ID
  34. };
  35. struct Varyings
  36. {
  37. float4 positionCS : SV_POSITION;
  38. float4 positionCSNoJitter : POSITION_CS_NO_JITTER;
  39. float4 previousPositionCSNoJitter : PREV_POSITION_CS_NO_JITTER;
  40. #if _ALPHATEST_ON
  41. float2 uv : TEXCOORD0;
  42. #endif
  43. UNITY_VERTEX_INPUT_INSTANCE_ID
  44. UNITY_VERTEX_OUTPUT_STEREO
  45. };
  46. // -------------------------------------
  47. // Vertex
  48. Varyings vert(Attributes input)
  49. {
  50. Varyings output = (Varyings)0;
  51. UNITY_SETUP_INSTANCE_ID(input);
  52. UNITY_TRANSFER_INSTANCE_ID(input, output);
  53. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  54. const VertexPositionInputs vertexInput = GetVertexPositionInputs(input.position.xyz);
  55. #if defined(_ALPHATEST_ON)
  56. output.uv = TRANSFORM_TEX(input.uv, _BaseMap);
  57. #endif
  58. #if defined(APLICATION_SPACE_WARP_MOTION)
  59. // We do not need jittered position in ASW
  60. output.positionCSNoJitter = mul(_NonJitteredViewProjMatrix, mul(UNITY_MATRIX_M, input.position));;
  61. output.positionCS = output.positionCSNoJitter;
  62. #else
  63. // Jittered. Match the frame.
  64. output.positionCS = vertexInput.positionCS;
  65. output.positionCSNoJitter = mul(_NonJitteredViewProjMatrix, mul(UNITY_MATRIX_M, input.position));
  66. #endif
  67. float4 prevPos = (unity_MotionVectorsParams.x == 1) ? float4(input.positionOld, 1) : input.position;
  68. #if _ADD_PRECOMPUTED_VELOCITY
  69. prevPos = prevPos - float4(input.alembicMotionVector, 0);
  70. #endif
  71. output.previousPositionCSNoJitter = mul(_PrevViewProjMatrix, mul(UNITY_PREV_MATRIX_M, prevPos));
  72. ApplyMotionVectorZBias(output.positionCS);
  73. return output;
  74. }
  75. // -------------------------------------
  76. // Fragment
  77. float4 frag(Varyings input) : SV_Target
  78. {
  79. UNITY_SETUP_INSTANCE_ID(input);
  80. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  81. #if defined(_ALPHATEST_ON)
  82. Alpha(SampleAlbedoAlpha(input.uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap)).a, _BaseColor, _Cutoff);
  83. #endif
  84. #if defined(LOD_FADE_CROSSFADE)
  85. LODFadeCrossFade(input.positionCS);
  86. #endif
  87. #if defined(APLICATION_SPACE_WARP_MOTION)
  88. return float4(CalcAswNdcMotionVectorFromCsPositions(input.positionCSNoJitter, input.previousPositionCSNoJitter), 1);
  89. #else
  90. return float4(CalcNdcMotionVectorFromCsPositions(input.positionCSNoJitter, input.previousPositionCSNoJitter), 0, 0);
  91. #endif
  92. }
  93. #endif // UNIVERSAL_OBJECT_MOTION_VECTORS_INCLUDED