Pass { $splice(PassName) Tags { $splice(LightMode) } // Render State $splice(RenderState) // Debug $splice(Debug) // -------------------------------------------------- // Pass HLSLPROGRAM // Pragmas $splice(PassPragmas) // Keywords $splice(PassKeywords) $splice(GraphKeywords) #define FORCE_VIRTUAL_TEXTURING_OFF 1 // For custom interpolators to inject a substruct definition before FragInputs definition, // allowing for FragInputs to capture CI's intended for ShaderGraph's SDI. $splice(CustomInterpolatorPreInclude) #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" // Decals do not support VT but we need to include it to avoid compilation error // Defines $AttributesMesh.normalOS: #define ATTRIBUTES_NEED_NORMAL $AttributesMesh.tangentOS: #define ATTRIBUTES_NEED_TANGENT $AttributesMesh.uv0: #define ATTRIBUTES_NEED_TEXCOORD0 $AttributesMesh.uv1: #define ATTRIBUTES_NEED_TEXCOORD1 $AttributesMesh.uv2: #define ATTRIBUTES_NEED_TEXCOORD2 $AttributesMesh.uv3: #define ATTRIBUTES_NEED_TEXCOORD3 $AttributesMesh.color: #define ATTRIBUTES_NEED_COLOR $AttributesMesh.instanceID: #define ATTRIBUTES_NEED_INSTANCEID $VaryingsMeshToPS.positionRWS: #define VARYINGS_NEED_POSITION_WS $VaryingsMeshToPS.normalWS: #define VARYINGS_NEED_TANGENT_TO_WORLD $VaryingsMeshToPS.texCoord0: #define VARYINGS_NEED_TEXCOORD0 $VaryingsMeshToPS.texCoord1: #define VARYINGS_NEED_TEXCOORD1 $VaryingsMeshToPS.texCoord2: #define VARYINGS_NEED_TEXCOORD2 $VaryingsMeshToPS.texCoord3: #define VARYINGS_NEED_TEXCOORD3 $VaryingsMeshToPS.color: #define VARYINGS_NEED_COLOR $VaryingsMeshToPS.instanceID: #define VARYINGS_NEED_INSTANCEID $FragInputs.instanceID: #define FRAG_INPUTS_USE_INSTANCEID $features.graphVertex: #define HAVE_MESH_MODIFICATION $SurfaceDescriptionInputs.FaceSign: // Define when IsFontFaceNode is included in ShaderGraph $SurfaceDescriptionInputs.FaceSign: #define VARYINGS_NEED_CULLFACE $splice(GraphDefines) // -- Properties used by ScenePickingPass #ifdef SCENEPICKINGPASS float4 _SelectionID; #endif // Includes $splice(PreGraphIncludes) // -------------------------------------------------- // Structs and Packing $splice(PassStructs) $splice(InterpolatorPack) // -------------------------------------------------- // Graph // Graph Properties $splice(GraphProperties) // Graph Includes $splice(GraphIncludes) // Graph Functions $splice(GraphFunctions) // Graph Vertex $splice(GraphVertex) // Graph Pixel $splice(GraphPixel) // -------------------------------------------------- // Build Graph Inputs $features.graphVertex: $include("Vertex.template.hlsl") $features.graphPixel: $include("Pixel.template.hlsl") // -------------------------------------------------- // Build Surface Data void GetSurfaceData(FragInputs fragInputs, float3 V, PositionInputs posInput, float angleFadeFactor, out DecalSurfaceData surfaceData) { #if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld); float fadeFactor = clamp(normalToWorld[0][3], 0.0f, 1.0f) * angleFadeFactor; float2 scale = float2(normalToWorld[3][0], normalToWorld[3][1]); float2 offset = float2(normalToWorld[3][2], normalToWorld[3][3]); fragInputs.texCoord0.xy = fragInputs.texCoord0.xy * scale + offset; fragInputs.texCoord1.xy = fragInputs.texCoord1.xy * scale + offset; fragInputs.texCoord2.xy = fragInputs.texCoord2.xy * scale + offset; fragInputs.texCoord3.xy = fragInputs.texCoord3.xy * scale + offset; fragInputs.positionRWS = posInput.positionWS; fragInputs.tangentToWorld[2].xyz = TransformObjectToWorldDir(float3(0, 1, 0)); fragInputs.tangentToWorld[1].xyz = TransformObjectToWorldDir(float3(0, 0, 1)); #else #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x); #endif float fadeFactor = 1.0; #endif SurfaceDescriptionInputs surfaceDescriptionInputs = FragInputsToSurfaceDescriptionInputs(fragInputs, V); SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); // setup defaults -- these are used if the graph doesn't output a value ZERO_INITIALIZE(DecalSurfaceData, surfaceData); #ifdef _MATERIAL_AFFECTS_EMISSION $SurfaceDescription.Emission: surfaceData.emissive.rgb = surfaceDescription.Emission.rgb * fadeFactor; #endif // copy across graph values, if defined #ifdef _MATERIAL_AFFECTS_ALBEDO $SurfaceDescription.BaseColor: surfaceData.baseColor.xyz = surfaceDescription.BaseColor; $SurfaceDescription.Alpha: surfaceData.baseColor.w = surfaceDescription.Alpha * fadeFactor; #endif #ifdef _MATERIAL_AFFECTS_NORMAL #ifdef DECAL_SURFACE_GRADIENT #if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) $SurfaceDescription.NormalTS: float3x3 tangentToWorld = transpose((float3x3)normalToWorld); #else $SurfaceDescription.NormalTS: float3x3 tangentToWorld = fragInputs.tangentToWorld; #endif $SurfaceDescription.NormalTS: surfaceData.normalWS.xyz = SurfaceGradientFromTangentSpaceNormalAndFromTBN(surfaceDescription.NormalTS.xyz, tangentToWorld[0], tangentToWorld[1]); #else #if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) $SurfaceDescription.NormalTS: surfaceData.normalWS.xyz = mul((float3x3)normalToWorld, surfaceDescription.NormalTS); #elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_PREVIEW) // We need to normalize as we use mikkt tangent space and this is expected (tangent space is not normalize) $SurfaceDescription.NormalTS: surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, fragInputs.tangentToWorld)); #endif #endif $SurfaceDescription.NormalAlpha: surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor; #else #if (SHADERPASS == SHADERPASS_FORWARD_PREVIEW) // Default to vertex normal #ifdef DECAL_SURFACE_GRADIENT $SurfaceDescription.NormalTS: surfaceData.normalWS.xyz = float3(0.0, 0.0, 0.0); #else $SurfaceDescription.NormalTS: surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(float3(0.0, 0.0, 0.1), fragInputs.tangentToWorld)); #endif #endif #endif // In case of Smoothness / AO / Metal, all the three are always computed but color mask can change #ifdef _MATERIAL_AFFECTS_MASKMAP $SurfaceDescription.Smoothness: surfaceData.mask.z = surfaceDescription.Smoothness; $SurfaceDescription.MAOSAlpha: surfaceData.mask.w = surfaceDescription.MAOSAlpha * fadeFactor; #ifdef DECALS_4RT $SurfaceDescription.Metallic: surfaceData.mask.x = surfaceDescription.Metallic; $SurfaceDescription.Occlusion: surfaceData.mask.y = surfaceDescription.Occlusion; $SurfaceDescription.MAOSAlpha: surfaceData.MAOSBlend.x = surfaceDescription.MAOSAlpha * fadeFactor; $SurfaceDescription.MAOSAlpha: surfaceData.MAOSBlend.y = surfaceDescription.MAOSAlpha * fadeFactor; #endif #endif } // -------------------------------------------------- // Main $splice(PostGraphIncludes) ENDHLSL }