Без опису
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

UnlitGBufferPass.hlsl 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #ifndef URP_UNLIT_GBUFFER_PASS_INCLUDED
  2. #define URP_UNLIT_GBUFFER_PASS_INCLUDED
  3. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Unlit.hlsl"
  4. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl"
  5. #if defined(LOD_FADE_CROSSFADE)
  6. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl"
  7. #endif
  8. struct Attributes
  9. {
  10. float4 positionOS : POSITION;
  11. float2 uv : TEXCOORD0;
  12. float3 normalOS : NORMAL;
  13. UNITY_VERTEX_INPUT_INSTANCE_ID
  14. };
  15. struct Varyings
  16. {
  17. float4 positionCS : SV_POSITION;
  18. float2 uv : TEXCOORD0;
  19. float3 normalWS : TEXCOORD1;
  20. UNITY_VERTEX_INPUT_INSTANCE_ID
  21. UNITY_VERTEX_OUTPUT_STEREO
  22. };
  23. void InitializeInputData(Varyings input, out InputData inputData)
  24. {
  25. inputData = (InputData)0;
  26. inputData.normalWS = NormalizeNormalPerPixel(input.normalWS);
  27. inputData.positionWS = float3(0, 0, 0);
  28. inputData.viewDirectionWS = half3(0, 0, 1);
  29. inputData.shadowCoord = 0;
  30. inputData.fogCoord = 0;
  31. inputData.vertexLighting = half3(0, 0, 0);
  32. inputData.bakedGI = half3(0, 0, 0);
  33. inputData.normalizedScreenSpaceUV = 0;
  34. inputData.shadowMask = half4(1, 1, 1, 1);
  35. }
  36. Varyings UnlitPassVertex(Attributes input)
  37. {
  38. Varyings output = (Varyings)0;
  39. UNITY_SETUP_INSTANCE_ID(input);
  40. UNITY_TRANSFER_INSTANCE_ID(input, output);
  41. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  42. VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
  43. output.positionCS = vertexInput.positionCS;
  44. output.uv = TRANSFORM_TEX(input.uv, _BaseMap);
  45. VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS);
  46. output.normalWS = normalInput.normalWS;
  47. return output;
  48. }
  49. FragmentOutput UnlitPassFragment(Varyings input)
  50. {
  51. UNITY_SETUP_INSTANCE_ID(input);
  52. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  53. half2 uv = input.uv;
  54. half4 texColor = SampleAlbedoAlpha(uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap));
  55. half3 color = texColor.rgb * _BaseColor.rgb;
  56. half alpha = texColor.a * _BaseColor.a;
  57. alpha = AlphaDiscard(alpha, _Cutoff);
  58. color = AlphaModulate(color, alpha);
  59. #ifdef LOD_FADE_CROSSFADE
  60. LODFadeCrossFade(input.positionCS);
  61. #endif
  62. InputData inputData;
  63. InitializeInputData(input, inputData);
  64. #ifdef _DBUFFER
  65. ApplyDecalToBaseColor(input.positionCS, color);
  66. #endif
  67. SurfaceData surfaceData = (SurfaceData)0;
  68. surfaceData.albedo = color;
  69. surfaceData.alpha = alpha;
  70. #if defined(_SCREEN_SPACE_OCCLUSION) // GBuffer never has transparents
  71. float2 normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(input.positionCS);
  72. AmbientOcclusionFactor aoFactor = GetScreenSpaceAmbientOcclusion(normalizedScreenSpaceUV);
  73. surfaceData.occlusion = aoFactor.directAmbientOcclusion;
  74. #else
  75. surfaceData.occlusion = 1;
  76. #endif
  77. return SurfaceDataToGbuffer(surfaceData, inputData, float3(0,0,0), kLightingInvalid);
  78. }
  79. #endif