123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- #ifndef INPUT_LUXLWRP_BASE_INCLUDED
- #define INPUT_LUXLWRP_BASE_INCLUDED
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
- // defines a bunch of helper functions (like lerpwhiteto)
- #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl"
- // defines SurfaceData, textures and the functions Alpha, SampleAlbedoAlpha, SampleNormal, SampleEmission
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"
- // defines e.g. "DECLARE_LIGHTMAP_OR_SH"
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
-
- #include "../Includes/Lux URP Translucent Lighting.hlsl"
- #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
- #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
- // Material Inputs
- CBUFFER_START(UnityPerMaterial)
- float4 _BaseMap_ST;
- half _Cutoff;
- half _Smoothness;
- half4 _SpecColor;
- half4 _WindMultiplier;
- float _SampleSize;
- //#ifdef _NORMALMAP
- half _GlossMapScale;
- half _BumpScale;
- //#endif
- float2 _DistanceFade;
- half _TranslucencyPower;
- half _TranslucencyStrength;
- half _ShadowStrength;
- half _MaskByShadowStrength;
- half _Distortion;
- #if defined(DEBUG)
- half _DebugColor;
- half _Brightness;
- #endif
- CBUFFER_END
- // Additional textures
- TEXTURE2D(_BumpSpecMap); SAMPLER(sampler_BumpSpecMap); float4 _BumpSpecMap_TexelSize;
- TEXTURE2D(_LuxLWRPWindRT); SAMPLER(sampler_LuxLWRPWindRT);
- // Global Inputs
- float4 _LuxLWRPWindDirSize;
- float4 _LuxLWRPWindStrengthMultipliers;
- float4 _LuxLWRPSinTime;
- float2 _LuxLWRPGust;
- // Structs
- struct VertexInput
- {
- float3 positionOS : POSITION;
- float3 normalOS : NORMAL;
- float4 tangentOS : TANGENT;
- float2 texcoord : TEXCOORD0;
- float2 lightmapUV : TEXCOORD1;
- half4 color : COLOR;
- UNITY_VERTEX_INPUT_INSTANCE_ID
- };
-
- struct VertexOutput
- {
- float4 positionCS : SV_POSITION;
- float2 uv : TEXCOORD0;
- half fade : TEXCOORD9;
- #if !defined(UNITY_PASS_SHADOWCASTER) && !defined(DEPTHONLYPASS)
- float3 normalWS : TEXCOORD3;
- #endif
- #if !defined(UNITY_PASS_SHADOWCASTER) && !defined(DEPTHONLYPASS)
- DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 1);
- #if defined(REQUIRES_WORLD_SPACE_POS_INTERPOLATOR)
- float3 positionWS : TEXCOORD2;
- #endif
- float3 viewDirWS : TEXCOORD4;
- #ifdef _NORMALMAP
- float4 tangentWS : TEXCOORD5;
- #endif
- half4 fogFactorAndVertexLight : TEXCOORD6;
- #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
- float4 shadowCoord : TEXCOORD7;
- #endif
- #endif
- #if defined(DEBUG)
- half4 color : COLOR;
- #endif
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- };
- struct SurfaceDescription
- {
- float3 albedo;
- float alpha;
- float3 normalTS;
- float3 emission;
- float metallic;
- float3 specular;
- float smoothness;
- float occlusion;
- float translucency;
- };
- half4 SmoothCurve( half4 x ) {
- return x * x *( 3.0h - 2.0h * x );
- }
- half4 TriangleWave( half4 x ) {
- return abs( frac( x + 0.5h ) * 2.0h - 1.0h );
- }
- half4 SmoothTriangleWave( half4 x ) {
- return SmoothCurve( TriangleWave( x ) );
- }
- half2 SmoothCurve( half2 x ) {
- return x * x *( 3.0h - 2.0h * x );
- }
- half2 TriangleWave( half2 x ) {
- return abs( frac( x + 0.5h ) * 2.0h - 1.0h );
- }
- half2 SmoothTriangleWave( half2 x ) {
- return SmoothCurve( TriangleWave( x ) );
- }
- #define foliageMainWindStrengthFromZone _LuxLWRPWindStrengthMultipliers.y
- #define primaryBending _WindMultiplier.x
- #define secondaryBending _WindMultiplier.y
- #define edgeFlutter _WindMultiplier.z
- void animateVertex(half4 animParams, half3 normalOS, inout float3 positionOS) {
- float origLength = length(positionOS.xyz);
- float3 windDir = mul(UNITY_MATRIX_I_M, float4(_LuxLWRPWindDirSize.xyz, 0)).xyz;
- half fDetailAmp = 0.1h;
- half fBranchAmp = 0.3h;
-
- #if !defined(_WIND_MATH)
- float2 samplePos = TransformObjectToWorld(positionOS.xyz * _SampleSize).xz * _LuxLWRPWindDirSize.ww;
-
- half fVtxPhase = dot( normalize(positionOS.xyz), ((animParams.g + animParams.r) * 0.5).xxx );
- float4 wind = SAMPLE_TEXTURE2D_LOD(_LuxLWRPWindRT, sampler_LuxLWRPWindRT, samplePos.xy, _WindMultiplier.w);
- // Factor in bending params from Material
- animParams.abg *= _WindMultiplier.xyz;
- // Make math match
- animParams.ab *= 2;
- // Primary bending
- positionOS.xz += animParams.a * windDir.xz * foliageMainWindStrengthFromZone * smoothstep(-1.5h, 1.0h, wind.r * (wind.g * 1.0h - 0.243h));
- // Second texture sample taking phase into account
- wind = SAMPLE_TEXTURE2D_LOD(_LuxLWRPWindRT, sampler_LuxLWRPWindRT, samplePos.xy - animParams.rr * 0.5, _WindMultiplier.w);
- // Edge Flutter
- float3 bend = normalOS.xyz * (animParams.g * fDetailAmp * lerp(_LuxLWRPSinTime.y, _LuxLWRPSinTime.z, wind.r));
- bend.y = animParams.b * 0.3h;
- // Edge Flutter and Secondary Bending
- positionOS.xyz += ( bend + ( animParams.b * windDir * wind.r * (wind.g * 2.0h - 0.243h) ) ) * foliageMainWindStrengthFromZone;
-
- #else
- float3 objectWorldPos = UNITY_MATRIX_M._m03_m13_m23;
- // Animate incoming wind
- float3 absObjectWorldPos = abs(objectWorldPos.xyz * 0.125h);
- float sinuswave = _SinTime.z;
- half2 vOscillations = SmoothTriangleWave( half2(absObjectWorldPos.x + sinuswave, absObjectWorldPos.z + sinuswave * 0.7h) );
- // x used for main wind bending / y used for tumbling
- half2 fOsc = (vOscillations.xy * vOscillations.xy);
- fOsc = 0.75h + (fOsc + 3.33h) * 0.33h;
- half fObjPhase = dot(objectWorldPos, 1);
- half fBranchPhase = fObjPhase + animParams.r;
- half fVtxPhase = dot(positionOS.xyz, animParams.g + fBranchPhase);
- // Factor in bending params from Material
- animParams.abg *= _WindMultiplier.xyz;
- // x is used for edges; y is used for branches
- float2 vWavesIn = _Time.yy + half2(fVtxPhase, fBranchPhase); // changed to float (android issues)
- // 1.975, 0.793, 0.375, 0.193 are good frequencies
- half4 vWaves = frac( vWavesIn.xxyy * float4(1.975f, 0.793f, 0.375f, 0.193f) ) * 2.0f - 1.0f; // changed to float (android issues)
- vWaves = SmoothTriangleWave( vWaves );
- half2 vWavesSum = vWaves.xz + vWaves.yw;
- // Primary bending / animated by * fOsc.x
- positionOS.xz += animParams.a * windDir.xz * foliageMainWindStrengthFromZone * fOsc.x;
- float3 bend = normalOS.xyz * (animParams.g * fDetailAmp);
- bend.y = animParams.b * fBranchAmp;
- positionOS.xyz += ( (vWavesSum.xyx * bend) + (animParams.b * windDir * fOsc.y * vWavesSum.y) ) * foliageMainWindStrengthFromZone;
- #endif
- positionOS.xyz = normalize(positionOS.xyz) * origLength;
- }
- #endif
|