Advertisement
Guest User

WireframeDissolveLitURP

a guest
May 10th, 2024
449
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "Universal Render Pipeline/Wireframe/DisplacementFade-SimpleLit"
  2. {
  3.     Properties
  4.     {
  5.         _MainTex ("Main Texture", 2D) = "white" { }
  6.         _Normal ("Normal Map", 2D) = "bump" { }
  7.         _WireThickness ("Wire Thickness", RANGE(0, 800)) = 100
  8.         [HDR] _WireColor ("Wire Color", Color) = (0,1,1,1)
  9.         [Toggle(INVERT)] _INVERT("Invert", Float) = 1
  10.         _MovingSlider ("Moving Slider", RANGE(-10, 10)) = 10
  11.         _Extrude("Extrude Amount", RANGE(-10, 10)) = 10
  12.         _WireFrameStay ("Wire Stay", RANGE(-1, 1)) = 0
  13.        
  14.     }
  15.     SubShader
  16.     {
  17.         Tags {"RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
  18.         LOD 100
  19.  
  20.         HLSLINCLUDE
  21.  
  22.         #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  23.         #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"    
  24.          #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
  25.          #pragma shader_feature INVERT
  26.          CBUFFER_START(UnityPerMaterial)
  27.        
  28.          float _WireThickness;
  29.          float4 _WireColor;
  30.          sampler2D _MainTex;
  31.          float _MovingSlider;
  32.          float _Extrude;
  33.          float _WireFrameStay;
  34.          sampler2D _Normal;
  35.          CBUFFER_END
  36.          struct Attributes
  37.          {
  38.              float4 positionOS       : POSITION;
  39.              UNITY_VERTEX_INPUT_INSTANCE_ID
  40.              float4 uv : TEXCOORD0;
  41.              
  42.              float3 normal :NORMAL;
  43.          };
  44.  
  45.          struct v2g
  46.          {
  47.              float4 projectionSpaceVertex : SV_POSITION;
  48.              float4 uv :TEXCOORD0;
  49.              float4 worldSpacePosition : TEXCOORD2;
  50.              float movingPos : TEXCOORD1;
  51.              float3 normal:NORMAL;
  52.              float3 worldNormal:TEXCOORD3;
  53.              UNITY_VERTEX_OUTPUT_STEREO
  54.          };
  55.  
  56.          v2g vert(Attributes input)
  57.          {
  58.              v2g output = (v2g)0;
  59.  
  60.              UNITY_SETUP_INSTANCE_ID(input);
  61.              UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  62.  
  63.              // move over the mesh y axis using a slider
  64.              // with option to invert
  65.              #if INVERT
  66.              float movingPos = input.positionOS.y + _MovingSlider;
  67.              #else
  68.              float movingPos = 1- input.positionOS.y + _MovingSlider;
  69.              #endif
  70.              input.positionOS.xyz -= saturate(1-movingPos) * input.normal * _Extrude;
  71.              VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
  72.              output.projectionSpaceVertex = vertexInput.positionCS;
  73.              output.worldSpacePosition = mul(UNITY_MATRIX_M, input.positionOS);
  74.              output.uv = input.uv;
  75.              output.worldNormal = TransformObjectToWorldNormal(input.normal);
  76.              output.normal = input.normal;
  77.              output.movingPos = movingPos;
  78.              return output;
  79.          }
  80.  
  81.          struct g2f
  82.          {
  83.              float4 projectionSpaceVertex : SV_POSITION;
  84.              float4 dist : TEXCOORD1;
  85.              float4 uv : TEXCOORD0;
  86.              float4 worldSpacePosition : TEXCOORD3;
  87.              float movingPos : TEXCOORD2;
  88.              float3 normal:NORMAL;
  89.              float3 worldNormal:TEXCOORD4;
  90.              UNITY_VERTEX_OUTPUT_STEREO
  91.          };
  92.  
  93.          [maxvertexcount(3)]
  94.          void geom(triangle v2g i[3], inout TriangleStream<g2f> triangleStream)
  95.          {
  96.              UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i[0]);
  97.  
  98.              float2 p0 = i[0].projectionSpaceVertex.xy / i[0].projectionSpaceVertex.w;
  99.              float2 p1 = i[1].projectionSpaceVertex.xy / i[1].projectionSpaceVertex.w;
  100.              float2 p2 = i[2].projectionSpaceVertex.xy / i[2].projectionSpaceVertex.w;
  101.  
  102.              float2 edge0 = p2 - p1;
  103.              float2 edge1 = p2 - p0;
  104.              float2 edge2 = p1 - p0;
  105.  
  106.              // To find the distance to the opposite edge, we take the
  107.              // formula for finding the area of a triangle Area = Base/2 * Height,
  108.              // and solve for the Height = (Area * 2)/Base.
  109.              // We can get the area of a triangle by taking its cross product
  110.              // divided by 2.  However we can avoid dividing our area/base by 2
  111.              // since our cross product will already be double our area.
  112.              float area = abs(edge1.x * edge2.y - edge1.y * edge2.x);
  113.              float wireThickness = 800 - _WireThickness;
  114.  
  115.              g2f o;
  116.              UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  117.              o.projectionSpaceVertex = i[0].projectionSpaceVertex;
  118.              o.worldSpacePosition = i[0].worldSpacePosition;
  119.              o.dist.xyz = float3( (area / length(edge0)), 0.0, 0.0) * o.projectionSpaceVertex.w * wireThickness;
  120.              o.dist.w = 1.0 / o.projectionSpaceVertex.w;
  121.              o.uv = i[0].uv;
  122.              o.normal = i[0].normal;
  123.              o.worldNormal = i[0].worldNormal;
  124.              o.movingPos = i[0].movingPos;
  125.              triangleStream.Append(o);
  126.  
  127.              o.projectionSpaceVertex = i[1].projectionSpaceVertex;
  128.              o.worldSpacePosition = i[1].worldSpacePosition;
  129.              o.dist.xyz = float3(0.0, (area / length(edge1)), 0.0) * o.projectionSpaceVertex.w * wireThickness;
  130.              o.dist.w = 1.0 / o.projectionSpaceVertex.w;
  131.              o.uv = i[1].uv;
  132.              o.normal = i[1].normal;
  133.              o.worldNormal = i[1].worldNormal;
  134.              o.movingPos = i[1].movingPos;
  135.              triangleStream.Append(o);
  136.  
  137.              o.projectionSpaceVertex = i[2].projectionSpaceVertex;
  138.              o.worldSpacePosition = i[2].worldSpacePosition;
  139.              o.dist.xyz = float3(0.0, 0.0, (area / length(edge2))) * o.projectionSpaceVertex.w * wireThickness;
  140.              o.dist.w = 1.0 / o.projectionSpaceVertex.w;
  141.              o.uv = i[2].uv;
  142.              o.normal = i[2].normal;
  143.              o.worldNormal = i[2].worldNormal;
  144.              o.movingPos = i[2].movingPos;
  145.              triangleStream.Append(o);
  146.          }
  147.  
  148.          float3 Lambert(float3 lightColor, float3 lightDir, float3 normal)
  149.          {
  150.              float NdotL = saturate(dot(normal, lightDir));
  151.              return lightColor * NdotL;
  152.          }
  153.          
  154.  
  155.          float3 Unity_NormalBlend(float3 A, float3 B)
  156. {
  157.  return normalize(float3(A.rg + B.rg, A.b * B.b));
  158. }
  159.  
  160.  
  161.          half4 frag(g2f i) : SV_Target
  162.          {
  163.              // unpack normal
  164.              float3 normal = UnpackNormal(tex2D(_Normal, i.uv.xy));
  165.                  // grab the shadow coordinates
  166.          #if SHADOWS_SCREEN
  167.              half4 shadowCoord = ComputeScreenPos(i.projectionSpaceVertex);
  168.          #else
  169.              half4 shadowCoord = TransformWorldToShadowCoord(i.worldSpacePosition.xyz);
  170.          #endif
  171.                  // grab the main light
  172.          #if _MAIN_LIGHT_SHADOWS_CASCADE || _MAIN_LIGHT_SHADOWS
  173.              Light light = GetMainLight(shadowCoord);
  174.          #else
  175.              Light light = GetMainLight();
  176.          #endif
  177.  
  178.              float3 lightCol = Lambert(light.color.rgb * unity_LightData.z, light.direction, Unity_NormalBlend(normal,i.worldNormal)) * light.shadowAttenuation;
  179.  
  180.              int lightsCount = GetAdditionalLightsCount();
  181.              for (int j = 0; j < lightsCount; j++)
  182.              {
  183.                  Light lightAdd = GetAdditionalLight(j, i.worldSpacePosition.xyz);
  184.                  lightCol += Lambert(lightAdd.color * (lightAdd.distanceAttenuation * lightAdd.shadowAttenuation), lightAdd.direction, Unity_NormalBlend(normal,i.normal));
  185.              }
  186.  
  187.  
  188.              float minDistanceToEdge = min(i.dist[0], min(i.dist[1], i.dist[2])) * i.dist[3];
  189.              float4 mainTex = tex2D(_MainTex, i.uv.xy);
  190.  
  191.              
  192.  
  193.              float3 _Ambient_ColorSky = SHADERGRAPH_AMBIENT_SKY.rgb;
  194.              float3 _Ambient_Equator = SHADERGRAPH_AMBIENT_EQUATOR.rgb;
  195.              float3 _Ambient_Ground = SHADERGRAPH_AMBIENT_GROUND.rgb;
  196.              float3 combinedAmbient = _Ambient_ColorSky+_Ambient_Equator+ _Ambient_Ground;
  197.              mainTex.rgb *= lightCol + combinedAmbient;  
  198.              // show texture where there is no wireframe
  199.              // also fades the wireframe over the moving position
  200.              if(minDistanceToEdge > 0.9* 1- saturate(i.movingPos - _WireFrameStay))
  201.              {
  202.                  // discard pixels where there is no wireframe earlier
  203.                  clip(i.movingPos - 0.2);
  204.                  return mainTex;
  205.              }
  206.              // discard pixels over the moving position
  207.              clip(i.movingPos);
  208.              return _WireColor;
  209.          }
  210.         ENDHLSL
  211.      
  212.  
  213.         Pass
  214.         {
  215.             // Wireframe shader based on the the following
  216.             // http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf
  217.  
  218.             HLSLPROGRAM
  219.  
  220.             #pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION
  221.             #pragma multi_compile _ LIGHTMAP_ON
  222.             #pragma multi_compile _ DYNAMICLIGHTMAP_ON
  223.             #pragma multi_compile _ DIRLIGHTMAP_COMBINED
  224.             #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
  225.             #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
  226.             #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS
  227.             #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING
  228.             #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION
  229.             #pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH
  230.             #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING
  231.             #pragma multi_compile _ SHADOWS_SHADOWMASK
  232.             #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3
  233.             #pragma multi_compile_fragment _ _LIGHT_LAYERS
  234.             #pragma multi_compile_fragment _ DEBUG_DISPLAY
  235.             #pragma multi_compile_fragment _ _LIGHT_COOKIES
  236.             #pragma multi_compile _ _FORWARD_PLUS
  237.             #pragma multi_compile _ EVALUATE_SH_MIXED EVALUATE_SH_VERTEX
  238.  
  239.  
  240.          
  241.  
  242.             #pragma vertex vert
  243.             #pragma geometry geom
  244.             #pragma fragment frag
  245.          
  246.             // -------------------------------------
  247.             // Unity defined keywords
  248.             #pragma multi_compile_instancing
  249.  
  250.        
  251.      
  252.          
  253.             ENDHLSL
  254.         }
  255.  
  256.         Pass
  257.         {
  258.             Name "ShadowCaster"
  259.             Tags
  260.             {
  261.                 "LightMode" = "ShadowCaster"
  262.             }
  263.  
  264.             // -------------------------------------
  265.             // Render State Commands
  266.             ZWrite On
  267.             ZTest LEqual
  268.             ColorMask 0
  269.             Cull[_Cull]
  270.  
  271.             HLSLPROGRAM
  272.             #pragma target 2.0
  273.             #pragma require geometry
  274.             // -------------------------------------
  275.             // Shader Stages
  276.             #pragma vertex vert
  277.             #pragma geometry geom
  278.             #pragma fragment frag
  279.  
  280.             // -------------------------------------
  281.             // Material Keywords
  282.             #pragma shader_feature_local _ALPHATEST_ON
  283.             #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
  284.  
  285.             //--------------------------------------
  286.             // GPU Instancing
  287.             #pragma multi_compile_instancing
  288.             #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
  289.  
  290.             // -------------------------------------
  291.             // Universal Pipeline keywords
  292.  
  293.             // -------------------------------------
  294.             // Unity defined keywords
  295.             #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
  296.  
  297.             // This is used during shadow map generation to differentiate between directional and punctual light shadows, as they use different formulas to apply Normal Bias
  298.             #pragma multi_compile_vertex _ _CASTING_PUNCTUAL_LIGHT_SHADOW
  299.  
  300.             // -------------------------------------
  301.             // Includes
  302.             ENDHLSL
  303.         }
  304.  
  305.         Pass
  306.         {
  307.             Name "DepthOnly"
  308.             Tags
  309.             {
  310.                 "LightMode" = "DepthOnly"
  311.             }
  312.  
  313.             // -------------------------------------
  314.             // Render State Commands
  315.             ZWrite On
  316.             ColorMask R
  317.             Cull[_Cull]
  318.  
  319.             HLSLPROGRAM
  320.             #pragma target 2.0
  321.             #pragma require geometry
  322.             // -------------------------------------
  323.             // Shader Stages
  324.             #pragma vertex vert
  325.             #pragma geometry geom
  326.             #pragma fragment frag
  327.  
  328.             // -------------------------------------
  329.             // Material Keywords
  330.             #pragma shader_feature_local _ALPHATEST_ON
  331.             #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
  332.  
  333.             // -------------------------------------
  334.             // Unity defined keywords
  335.             #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
  336.  
  337.             //--------------------------------------
  338.             // GPU Instancing
  339.             #pragma multi_compile_instancing
  340.             #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
  341.  
  342.             // -------------------------------------
  343.             // Includes
  344.             ENDHLSL
  345.         }
  346.  
  347.         // This pass is used when drawing to a _CameraNormalsTexture texture
  348.         Pass
  349.         {
  350.             Name "DepthNormals"
  351.             Tags
  352.             {
  353.                 "LightMode" = "DepthNormals"
  354.             }
  355.  
  356.             // -------------------------------------
  357.             // Render State Commands
  358.             ZWrite On
  359.             Cull[_Cull]
  360.  
  361.             HLSLPROGRAM
  362.             #pragma target 2.0
  363.             #pragma require geometry
  364.             // -------------------------------------
  365.             // Shader Stages
  366.             #pragma vertex vert
  367.             #pragma geometry geom
  368.             #pragma fragment frag
  369.             // -------------------------------------
  370.             // Material Keywords
  371.             #pragma shader_feature_local _NORMALMAP
  372.             #pragma shader_feature_local _PARALLAXMAP
  373.             #pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
  374.             #pragma shader_feature_local_fragment _ALPHATEST_ON
  375.             #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
  376.  
  377.             // -------------------------------------
  378.             // Unity defined keywords
  379.             #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
  380.  
  381.             // -------------------------------------
  382.             // Universal Pipeline keywords
  383.             #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"
  384.  
  385.             //--------------------------------------
  386.             // GPU Instancing
  387.             #pragma multi_compile_instancing
  388.             #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
  389.  
  390.             // -------------------------------------
  391.             // Includes
  392.             ENDHLSL
  393.         }
  394.  
  395.     }
  396.  
  397.     FallBack "Hidden/Universal Render Pipeline/FallbackError"
  398. }
  399.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement