Advertisement
remo9211

L2 URP Grass

May 20th, 2024
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Godot GLSL 8.54 KB | Source Code | 0 0
  1. Shader "L02_URP/Grass"{
  2.     Properties{
  3.  
  4.         _TopColor("Top Color", Color) = (1,1,1,1)
  5.         _BottomColor("Bottom Color", Color) = (1,1,1,1)
  6.         _TranslucentGain("Translucent Gain", Range(0,1)) = 0.5
  7.  
  8.         _BendRotationRandom("Bend Rotation Random", Range(0, 1)) = 0.2
  9.  
  10.         _BladeWidth("Blade Width", Float) = 0.05
  11.         _BladeWidthRandom("Blade Width Random", Float) = 0.02
  12.         _BladeHeight("Blade Height", Float) = 0.5
  13.         _BladeHeightRandom("Blade Height Random", Float) = 0.3
  14.        
  15.         _TessellationUniform("Tessellation Uniform", Range(1, 64)) = 1
  16.  
  17.         _WindDistortionMap("Wind Distortion Map", 2D) = "white" {}
  18.         _WindFrequency("Wind Frequency", Vector) = (0.05, 0.05, 0, 0)
  19.  
  20.         _WindStrength("Wind Strength", Float) = 1
  21.  
  22.         _BladeForward("Blade Forward Amount", Float) = 0.38
  23.         _BladeCurve("Blade Curvature Amount", Range(1, 4)) = 2
  24.     }
  25.     SubShader{
  26.         Tags{
  27.             "RenderType" = "Opaque"
  28.             "Queue" = "Geometry"
  29.             "RenderPipeline" = "UniversalPipeline"
  30.         }
  31.         LOD 100
  32.         Cull Off
  33.  
  34.         HLSLINCLUDE
  35.             #pragma require geometry
  36.             #pragma require tessellation tessHW
  37.             #pragma vertex vert
  38.             #pragma fragment frag
  39.             #pragma hull hull
  40.             #pragma domain domain
  41.             #pragma geometry geo
  42.             #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  43.             #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
  44.             #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
  45.  
  46.             #pragma multi_compile _ _MAIN_LIGHT_SHADOWS
  47.             #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
  48.             #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
  49.             #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
  50.             #pragma multi_compile _ _SHADOWS_SOFT
  51.  
  52.             #define UNITY_PI 3.14159265359f
  53.             #define UNITY_TWO_PI 6.28318530718f
  54.             #define BLADE_SEGMENTS 3
  55.  
  56.             CBUFFER_START(UnityPerMaterial)
  57.                 float4 _BaseColor;
  58.                 float4 _BaseMap_ST;
  59.                 float _BendRotationRandom;
  60.  
  61.                 float _TessellationUniform;
  62.  
  63.  
  64.                 float _BladeHeight;
  65.                 float _BladeHeightRandom;  
  66.                 float _BladeWidth;
  67.                 float _BladeWidthRandom;
  68.  
  69.                 sampler2D _WindDistortionMap;
  70.                 float4 _WindDistortionMap_ST;
  71.  
  72.                 float2 _WindFrequency;
  73.                 float _WindStrength;
  74.  
  75.                 float _BladeForward;
  76.                 float _BladeCurve;
  77.  
  78.                 float4 _TopColor;
  79.                 float4 _BottomColor;
  80.  
  81.  
  82.             CBUFFER_END
  83.             TEXTURE2D (_BaseMap);SAMPLER(sampler_BaseMap);
  84.  
  85.  
  86.             struct vertexInput
  87.             {
  88.                 float4 vertex : POSITION;
  89.                 float3 normal : NORMAL;
  90.                 float4 tangent : TANGENT;
  91.             };
  92.  
  93.             struct vertexOutput
  94.             {
  95.                 float4 vertex : SV_POSITION;
  96.                 float3 normal : NORMAL;
  97.                 float4 tangent : TANGENT;
  98.             };
  99.  
  100.             struct TessellationFactors
  101.             {
  102.                 float edge[3] : SV_TessFactor;
  103.                 float inside : SV_InsideTessFactor;
  104.             };
  105.  
  106.             struct geometryOutput
  107.             {
  108.                 float4 pos : SV_POSITION;
  109.                 float2 uv : TEXCOORD0;
  110.                 // unityShadowCoord4 _ShadowCoord : TEXCOORD1;
  111.                 float3 worldPos : TEXCOORD1;
  112.                 // float3 normal : NORMAL;
  113.                 float4 shadowCoord : TEXCOORD2;
  114.             };
  115.  
  116.             /*
  117.                 Tools Function
  118.             */
  119.             float rand(float3 co){
  120.                 return frac(sin(dot(co.xyz, float3(12.9898, 78.233, 53.539))) * 43758.5453);
  121.             }
  122.             float3x3 AngleAxis3x3(float angle, float3 axis){
  123.                 float c, s;
  124.                 sincos(angle, s, c);
  125.  
  126.                 float t = 1 - c;
  127.                 float x = axis.x;
  128.                 float y = axis.y;
  129.                 float z = axis.z;
  130.  
  131.                 return float3x3(
  132.                     t * x * x + c, t * x * y - s * z, t * x * z + s * y,
  133.                     t * x * y + s * z, t * y * y + c, t * y * z - s * x,
  134.                     t * x * z - s * y, t * y * z + s * x, t * z * z + c
  135.                     );
  136.             }
  137.             /*
  138.                 Vertex Shader
  139.             */
  140.             vertexInput vert(vertexInput v){
  141.                 return v;
  142.             }
  143.             /*
  144.                 Tesselation Shader
  145.             */
  146.             vertexOutput tessVert(vertexInput v){
  147.                 vertexOutput o;
  148.                 o.vertex = v.vertex;
  149.                 o.normal = v.normal;
  150.                 o.tangent = v.tangent;
  151.                 return o;
  152.             }
  153.             TessellationFactors patchConstantFunction (InputPatch<vertexInput, 3> patch){
  154.                 TessellationFactors f;
  155.                 f.edge[0] = _TessellationUniform;
  156.                 f.edge[1] = _TessellationUniform;
  157.                 f.edge[2] = _TessellationUniform;
  158.                 f.inside = _TessellationUniform;
  159.                 return f;
  160.             }
  161.             [domain("tri")]
  162.             [outputcontrolpoints(3)]
  163.             [outputtopology("triangle_cw")]
  164.             [partitioning("integer")]
  165.             [patchconstantfunc("patchConstantFunction")]
  166.             vertexInput hull (InputPatch<vertexInput, 3> patch, uint id : SV_OutputControlPointID){
  167.                 return patch[id];
  168.             }
  169.  
  170.             [domain("tri")]
  171.             vertexOutput domain(TessellationFactors factors, OutputPatch<vertexInput, 3> patch, float3 barycentricCoordinates : SV_DomainLocation){
  172.                 vertexInput v;
  173.                 #define MY_DOMAIN_PROGRAM_INTERPOLATE(fieldName) v.fieldName = \
  174.                     patch[0].fieldName * barycentricCoordinates.x + \
  175.                     patch[1].fieldName * barycentricCoordinates.y + \
  176.                     patch[2].fieldName * barycentricCoordinates.z;
  177.                 MY_DOMAIN_PROGRAM_INTERPOLATE(vertex)
  178.                 MY_DOMAIN_PROGRAM_INTERPOLATE(normal)
  179.                 MY_DOMAIN_PROGRAM_INTERPOLATE(tangent)
  180.                 return tessVert(v);
  181.             }
  182.             geometryOutput GenerateGrassVertex(float3 vertexPosition, float width, float height, float forward, float2 uv, float3x3 transformMatrix){
  183.                 float3 tangentPoint = float3(width, forward, height);
  184.                 float3 localPosition = vertexPosition + mul(transformMatrix, tangentPoint);
  185.                 float3 tangentNormal = normalize(float3(0, -1, forward));
  186.                 float3 localNormal = mul(transformMatrix, tangentNormal);
  187.                 float3 positionWS = TransformObjectToWorld(localPosition);
  188.                 geometryOutput o;
  189.                 o.pos = TransformObjectToHClip(localPosition);
  190.                 o.worldPos = TransformWorldToHClip(localPosition + mul(transformMatrix, tangentPoint)).xyz;
  191.                 o.uv = uv;
  192.                 // o.normal = TransformObjectToWorldNormal(localNormal);
  193.                 o.shadowCoord = TransformWorldToShadowCoord(positionWS);
  194.                 return o;
  195.             }
  196.             [maxvertexcount(BLADE_SEGMENTS * 2 + 1)]
  197.             void geo(triangle vertexOutput IN[3], inout TriangleStream<geometryOutput> triStream){ 
  198.                 float3 vNormal = IN[0].normal;
  199.                 float4 vTangent = IN[0].tangent;
  200.                 float3 vBinormal = cross(vNormal, vTangent.xyz) * vTangent.w;
  201.  
  202.                 float3x3 tangentToLocal = float3x3(
  203.                     vTangent.x, vBinormal.x, vNormal.x,
  204.                     vTangent.y, vBinormal.y, vNormal.y,
  205.                     vTangent.z, vBinormal.z, vNormal.z
  206.                     );
  207.                 float3 pos = IN[0].vertex.xyz;
  208.  
  209.                 float3x3 facingRotationMatrix = AngleAxis3x3(rand(pos) * UNITY_TWO_PI, float3(0, 0, 1));
  210.                 float3x3 bendRotationMatrix = AngleAxis3x3(rand(pos.zzx) * _BendRotationRandom * UNITY_PI * 0.5, float3(-1, 0, 0));
  211.  
  212.                 float2 uv = pos.xz * _WindDistortionMap_ST.xy + _WindDistortionMap_ST.zw + _WindFrequency * _Time.y;
  213.  
  214.                 float2 windSample = (tex2Dlod(_WindDistortionMap, float4(uv, 0, 0)).xy * 2 - 1) * _WindStrength;
  215.  
  216.                 float3 wind = normalize(float3(windSample.x, windSample.y, 0));
  217.  
  218.                 float3x3 windRotation = AngleAxis3x3(UNITY_PI * windSample.x, wind);
  219.  
  220.                 float3x3 transformationMatrix = mul(mul(mul(tangentToLocal, windRotation), facingRotationMatrix), bendRotationMatrix);
  221.  
  222.                 float height = (rand(pos.zyx) * 2 - 1) * _BladeHeightRandom + _BladeHeight;
  223.                 float width = (rand(pos.xzy) * 2 - 1) * _BladeWidthRandom + _BladeWidth;
  224.  
  225.                 float forward = rand(pos.yyz) * _BladeForward;
  226.  
  227.                 float3x3 transformationMatrixFacing = mul(tangentToLocal, facingRotationMatrix);
  228.  
  229.                 for (int i = 0; i < BLADE_SEGMENTS; i++){
  230.                     float t = i / (float)BLADE_SEGMENTS;
  231.                     float segmentHeight = height * t;
  232.                     float segmentWidth = width * (1 - t);
  233.                     float segmentForward = pow(t, _BladeCurve) * forward;
  234.                     float3x3 transformMatrix = i == 0 ? transformationMatrixFacing : transformationMatrix;
  235.                     triStream.Append(GenerateGrassVertex(pos, segmentWidth, segmentHeight, segmentForward, float2(0, t), transformMatrix));
  236.                     triStream.Append(GenerateGrassVertex(pos, -segmentWidth, segmentHeight, segmentForward, float2(1, t), transformMatrix));
  237.                 }
  238.                 triStream.Append(GenerateGrassVertex(pos, 0, height, forward, float2(0.5, 1), transformationMatrix));
  239.             }
  240.         ENDHLSL
  241.  
  242.         Pass{
  243.             Name "GrassPass"
  244.             Tags{ "LightMode" = "UniversalForward" }
  245.  
  246.             HLSLPROGRAM
  247.  
  248.                 float4 frag (geometryOutput i) : SV_Target{
  249.                     Light mainLight = GetMainLight(i.shadowCoord);
  250.                     float4 shadow = lerp(0.0, 1.0, mainLight.shadowAttenuation + 0.25f);
  251.                     return shadow * lerp(_BottomColor, _TopColor, i.uv.y);
  252.  
  253.                 }
  254.             ENDHLSL
  255.         }
  256.  
  257.  
  258.         Pass{
  259.             Name "ShadowCaster"
  260.             Tags{ "LightMode" = "ShadowCaster" }
  261.    
  262.             ZWrite On
  263.             ZTest LEqual
  264.    
  265.             HLSLPROGRAM
  266.    
  267.                 half4 frag(geometryOutput input) : SV_TARGET{
  268.                     return 1;
  269.                 }
  270.    
  271.             ENDHLSL
  272.         }
  273.     }
  274. }
Tags: grass URP
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement