Advertisement
Guest User

Untitled

a guest
Jan 10th, 2021
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "Custom/Geometry/Extrude"
  2. {
  3.     Properties
  4.     {
  5.         _MainTex ("Texture", 2D) = "white" {}
  6.         _Factor ("Factor", Range(0., 2.)) = 0.2
  7.     }
  8.     SubShader
  9.     {
  10.         Tags
  11.         {
  12.             "RenderType"="Opaque"
  13.         }
  14.         Cull Off
  15.  
  16.         Pass
  17.         {
  18.             CGPROGRAM
  19.             #pragma vertex vert
  20.             #pragma fragment frag
  21.             #pragma geometry geom
  22.  
  23.             #include "UnityCG.cginc"
  24.  
  25.             struct v2g
  26.             {
  27.                 float4 vertex : POSITION;
  28.                 float3 normal : NORMAL;
  29.                 float2 uv : TEXCOORD0;
  30.             };
  31.  
  32.             struct g2f
  33.             {
  34.                 float4 pos : SV_POSITION;
  35.                 float2 uv : TEXCOORD0;
  36.                 fixed4 col : COLOR;
  37.             };
  38.  
  39.             sampler2D _MainTex;
  40.             float4 _MainTex_ST;
  41.  
  42.             v2g vert(appdata_base v)
  43.             {
  44.                 v2g o;
  45.                 o.vertex = v.vertex;
  46.                 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  47.                 o.normal = v.normal;
  48.                 return o;
  49.             }
  50.  
  51.             float _Factor;
  52.  
  53.             [maxvertexcount(24)]
  54.             void geom(triangle v2g IN[3], inout TriangleStream<g2f> tristream)
  55.             {
  56.                 g2f o;
  57.  
  58.                 float3 edgeA = IN[1].vertex - IN[0].vertex;
  59.                 float3 edgeB = IN[2].vertex - IN[0].vertex;
  60.                 float3 normalFace = normalize(cross(edgeA, edgeB));
  61.  
  62.                 for (int i = 0; i < 3; i++)
  63.                 {
  64.                     o.pos = UnityObjectToClipPos(IN[i].vertex);
  65.                     o.uv = IN[i].uv;
  66.                     o.col = fixed4(0., 0., 0., 1.);
  67.                     tristream.Append(o);
  68.  
  69.                     o.pos = UnityObjectToClipPos(IN[i].vertex + float4(normalFace, 0) * _Factor);
  70.                     o.uv = IN[i].uv;
  71.                     o.col = fixed4(1., 1., 1., 1.);
  72.                     tristream.Append(o);
  73.  
  74.                     int inext = (i + 1) % 3;
  75.  
  76.                     o.pos = UnityObjectToClipPos(IN[inext].vertex);
  77.                     o.uv = IN[inext].uv;
  78.                     o.col = fixed4(0., 0., 0., 1.);
  79.                     tristream.Append(o);
  80.  
  81.                     tristream.RestartStrip();
  82.  
  83.                     o.pos = UnityObjectToClipPos(IN[i].vertex + float4(normalFace, 0) * _Factor);
  84.                     o.uv = IN[i].uv;
  85.                     o.col = fixed4(1., 1., 1., 1.);
  86.                     tristream.Append(o);
  87.  
  88.                     o.pos = UnityObjectToClipPos(IN[inext].vertex);
  89.                     o.uv = IN[inext].uv;
  90.                     o.col = fixed4(0., 0., 0., 1.);
  91.                     tristream.Append(o);
  92.  
  93.                     o.pos = UnityObjectToClipPos(IN[inext].vertex + float4(normalFace, 0) * _Factor);
  94.                     o.uv = IN[inext].uv;
  95.                     o.col = fixed4(1., 1., 1., 1.);
  96.                     tristream.Append(o);
  97.  
  98.                     tristream.RestartStrip();
  99.                 }
  100.  
  101.                 for (int i = 0; i < 3; i++)
  102.                 {
  103.                     o.pos = UnityObjectToClipPos(IN[i].vertex + float4(normalFace, 0) * _Factor);
  104.                     o.uv = IN[i].uv;
  105.                     o.col = fixed4(1., 1., 1., 1.);
  106.                     tristream.Append(o);
  107.                 }
  108.  
  109.                 tristream.RestartStrip();
  110.  
  111.                 for (int i = 0; i < 3; i++)
  112.                 {
  113.                     o.pos = UnityObjectToClipPos(IN[i].vertex);
  114.                     o.uv = IN[i].uv;
  115.                     o.col = fixed4(0., 0., 0., 1.);
  116.                     tristream.Append(o);
  117.                 }
  118.  
  119.                 tristream.RestartStrip();
  120.             }
  121.  
  122.             fixed4 frag(g2f i) : SV_Target
  123.             {
  124.                 fixed4 col = tex2D(_MainTex, i.uv) * i.col;
  125.                 return col;
  126.             }
  127.             ENDCG
  128.         }
  129.  
  130.         Pass
  131.         {
  132.             Tags
  133.             {
  134.                 "LightMode" = "ShadowCaster"
  135.             }
  136.  
  137.             CGPROGRAM
  138.             #pragma target 3.0
  139.  
  140.             #pragma vertex vert
  141.             #pragma geometry geom
  142.             #pragma fragment frag
  143.             #pragma multi_compile_shadowcaster
  144.             #include "UnityCG.cginc"
  145.  
  146.  
  147.  
  148.                 struct v2g
  149.             {
  150.                 float4 vertex : POSITION;
  151.                 float3 normal : NORMAL;
  152.                 float2 uv : TEXCOORD0;
  153.             };
  154.  
  155.             struct g2f
  156.             {
  157.                 float4 pos : SV_POSITION;
  158.                 float2 uv : TEXCOORD0;
  159.                 fixed4 col : COLOR;
  160.             };
  161.  
  162.             sampler2D _MainTex;
  163.             float4 _MainTex_ST;
  164.  
  165.             v2g vert(appdata_base v)
  166.             {
  167.                 v2g o;
  168.                 o.vertex = v.vertex;
  169.                 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  170.                 o.normal = v.normal;
  171.                 return o;
  172.             }
  173.  
  174.             float _Factor;
  175.  
  176.             [maxvertexcount(24)]
  177.             void geom(triangle v2g IN[3], inout TriangleStream<g2f> tristream)
  178.             {
  179.                 g2f o;
  180.  
  181.                 float3 edgeA = IN[1].vertex - IN[0].vertex;
  182.                 float3 edgeB = IN[2].vertex - IN[0].vertex;
  183.                 float3 normalFace = normalize(cross(edgeA, edgeB));
  184.  
  185.                 for (int i = 0; i < 3; i++)
  186.                 {
  187.                     o.pos = UnityObjectToClipPos(IN[i].vertex);
  188.                     o.uv = IN[i].uv;
  189.                     o.col = fixed4(0., 0., 0., 1.);
  190.                     tristream.Append(o);
  191.  
  192.                     o.pos = UnityObjectToClipPos(IN[i].vertex + float4(normalFace, 0) * _Factor);
  193.                     o.uv = IN[i].uv;
  194.                     o.col = fixed4(1., 1., 1., 1.);
  195.                     tristream.Append(o);
  196.  
  197.                     int inext = (i + 1) % 3;
  198.  
  199.                     o.pos = UnityObjectToClipPos(IN[inext].vertex);
  200.                     o.uv = IN[inext].uv;
  201.                     o.col = fixed4(0., 0., 0., 1.);
  202.                     tristream.Append(o);
  203.  
  204.                     tristream.RestartStrip();
  205.  
  206.                     o.pos = UnityObjectToClipPos(IN[i].vertex + float4(normalFace, 0) * _Factor);
  207.                     o.uv = IN[i].uv;
  208.                     o.col = fixed4(1., 1., 1., 1.);
  209.                     tristream.Append(o);
  210.  
  211.                     o.pos = UnityObjectToClipPos(IN[inext].vertex);
  212.                     o.uv = IN[inext].uv;
  213.                     o.col = fixed4(0., 0., 0., 1.);
  214.                     tristream.Append(o);
  215.  
  216.                     o.pos = UnityObjectToClipPos(IN[inext].vertex + float4(normalFace, 0) * _Factor);
  217.                     o.uv = IN[inext].uv;
  218.                     o.col = fixed4(1., 1., 1., 1.);
  219.                     tristream.Append(o);
  220.  
  221.                     tristream.RestartStrip();
  222.                 }
  223.  
  224.                 for (int i = 0; i < 3; i++)
  225.                 {
  226.                     o.pos = UnityObjectToClipPos(IN[i].vertex + float4(normalFace, 0) * _Factor);
  227.                     o.uv = IN[i].uv;
  228.                     o.col = fixed4(1., 1., 1., 1.);
  229.                     tristream.Append(o);
  230.                 }
  231.  
  232.                 tristream.RestartStrip();
  233.  
  234.                 for (int i = 0; i < 3; i++)
  235.                 {
  236.                     o.pos = UnityObjectToClipPos(IN[i].vertex);
  237.                     o.uv = IN[i].uv;
  238.                     o.col = fixed4(0., 0., 0., 1.);
  239.                     tristream.Append(o);
  240.                 }
  241.  
  242.                 tristream.RestartStrip();
  243.             }
  244.  
  245.             fixed4 frag(g2f i) : SV_Target
  246.             {
  247.                 fixed4 col = tex2D(_MainTex, i.uv) * i.col;
  248.                 return col;
  249.             }
  250.  
  251.             ENDCG
  252.         }
  253.     }
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement