Pass { $splice(PassName) // Render State $splice(RenderState) // Debug $splice(Debug) // -------------------------------------------------- // Pass HLSLPROGRAM // Pragmas $splice(PassPragmas) // Keywords $splice(PassKeywords) $splice(GraphKeywords) // Defines $Attributes.vertexID: #define ATTRIBUTES_NEED_VERTEXID $Attributes.uv0: #define ATTRIBUTES_NEED_TEXCOORD0 $Attributes.uv1: #define ATTRIBUTES_NEED_TEXCOORD1 $Attributes.uv2: #define ATTRIBUTES_NEED_TEXCOORD2 $Attributes.uv3: #define ATTRIBUTES_NEED_TEXCOORD3 $Varyings.texCoord0: #define VARYINGS_NEED_TEXCOORD0 $Varyings.texCoord1: #define VARYINGS_NEED_TEXCOORD1 $Varyings.texCoord2: #define VARYINGS_NEED_TEXCOORD2 $Varyings.texCoord3: #define VARYINGS_NEED_TEXCOORD3 $splice(PassInstancing) $splice(GraphDefines) // Includes $splice(PreGraphIncludes) // -------------------------------------------------- // Structs and Packing $splice(PassStructs) $splice(InterpolatorPack) // -------------------------------------------------- // Graph // Graph Properties $splice(GraphProperties) // Graph Includes $splice(GraphIncludes) // Graph Functions $splice(GraphFunctions) // Graph Pixel $splice(GraphPixel) // -------------------------------------------------- // Build Graph Inputs void BuildVaryings(Attributes input, inout Varyings output) { UNITY_SETUP_INSTANCE_ID(input); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); output.texCoord0 = output.positionCS * 0.5 + 0.5; #if UNITY_UV_STARTS_AT_TOP if (_FlipY < 0.5) output.texCoord0.y = 1 - output.texCoord0.y; #endif float3 p = ComputeWorldSpacePosition(output.positionCS, UNITY_MATRIX_I_VP); // Encode view direction in texCoord1 output.texCoord1.xyz = GetWorldSpaceViewDir(p); } float3 _WaterDecalTimeParameters; SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) { SurfaceDescriptionInputs output; ZERO_INITIALIZE(SurfaceDescriptionInputs, output); $SurfaceDescriptionInputs.ScreenPosition: output.ScreenPosition = float4(input.texCoord0.xy, 0, 1); $SurfaceDescriptionInputs.NDCPosition: output.NDCPosition = input.texCoord0.xy; $SurfaceDescriptionInputs.uv0: output.uv0 = input.texCoord0; $SurfaceDescriptionInputs.uv1: output.uv1 = input.texCoord1; $SurfaceDescriptionInputs.uv2: output.uv2 = input.texCoord2; $SurfaceDescriptionInputs.uv3: output.uv3 = input.texCoord3; $SurfaceDescriptionInputs.TimeParameters: output.TimeParameters = _WaterDecalTimeParameters.xyz; return output; } // -------------------------------------------------- // Main PackedVaryings Vert(Attributes input) { Varyings output = (Varyings)0; output.positionCS = GetFullScreenTriangleVertexPosition(input.vertexID, UNITY_RAW_FAR_CLIP_VALUE); BuildVaryings(input, output); PackedVaryings packedOutput = PackVaryings(output); return packedOutput; } #ifdef PASS_DEFORMATION #define TARGET_TYPE float4 #elif defined(PASS_FOAM) #define TARGET_TYPE float2 #elif defined(PASS_MASK) #define TARGET_TYPE float4 #elif defined(PASS_LARGE_CURRENT) #define TARGET_TYPE float3 #elif defined(PASS_RIPPLES_CURRENT) #define TARGET_TYPE float3 #endif TARGET_TYPE Frag(PackedVaryings packedInput) : SV_Target { Varyings varyings = UnpackVaryings(packedInput); SurfaceDescriptionInputs inputs = BuildSurfaceDescriptionInputs(varyings); SurfaceDescription surface = SurfaceDescriptionFunction(inputs); float3 deformation = 0.0f; float2 foam = 0.0f; float4 mask = 1.0f; float3 largeCurrent = 0.0f; float3 ripplesCurrent = 0.0f; #if _AFFECTS_DEFORMATION == 1 $Material.Deformation: deformation = float3(surface.Deformation, surface.HorizontalDeformation.x, surface.HorizontalDeformation.y); #endif #if _AFFECTS_FOAM == 1 $Material.SurfaceFoam: foam.x = saturate(surface.SurfaceFoam); $Material.DeepFoam: foam.y = saturate(surface.DeepFoam); #endif #if _AFFECTS_MASK == 1 $Material.SimulationMask: mask.xyz = saturate(surface.SimulationMask); $Material.SimulationFoamMask: mask.w = saturate(surface.SimulationFoamMask); #endif #if _AFFECTS_LARGE_CURRENT == 1 $Material.LargeCurrent: largeCurrent.xy = surface.LargeCurrent; $Material.LargeCurrentInfluence: largeCurrent.z = saturate(surface.LargeCurrentInfluence); #endif #if _AFFECTS_RIPPLES_CURRENT == 1 $Material.RipplesCurrent: ripplesCurrent.xy = surface.RipplesCurrent; $Material.RipplesCurrentInfluence: ripplesCurrent.z = saturate(surface.RipplesCurrentInfluence); #endif #ifdef PASS_DEFORMATION return float4(surface.Deformation, surface.HorizontalDeformation.x, surface.HorizontalDeformation.y, 0); #elif defined(PASS_FOAM) return float2(foam); #elif defined(PASS_MASK) return mask; #elif defined(PASS_LARGE_CURRENT) return largeCurrent; #elif defined(PASS_RIPPLES_CURRENT) return ripplesCurrent; #endif } $splice(PostGraphIncludes) ENDHLSL }