You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
8.3 KiB
191 lines
8.3 KiB
Pass |
|
{ |
|
$splice(PassName) |
|
Tags |
|
{ |
|
$splice(LightMode) |
|
} |
|
|
|
// Render State |
|
$splice(RenderState) |
|
|
|
// Debug |
|
$splice(Debug) |
|
|
|
// -------------------------------------------------- |
|
// Pass |
|
|
|
HLSLPROGRAM |
|
|
|
// Pragmas |
|
$splice(PassPragmas) |
|
|
|
// Keywords |
|
$splice(PassKeywords) |
|
$splice(GraphKeywords) |
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" |
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" |
|
|
|
// Defines |
|
$Attributes.normalOS: #define ATTRIBUTES_NEED_NORMAL |
|
$Attributes.tangentOS: #define ATTRIBUTES_NEED_TANGENT |
|
$Attributes.uv0: #define ATTRIBUTES_NEED_TEXCOORD0 |
|
$Attributes.uv1: #define ATTRIBUTES_NEED_TEXCOORD1 |
|
$Attributes.uv2: #define ATTRIBUTES_NEED_TEXCOORD2 |
|
$Attributes.uv3: #define ATTRIBUTES_NEED_TEXCOORD3 |
|
$Attributes.color: #define ATTRIBUTES_NEED_COLOR |
|
$Varyings.positionWS: #define VARYINGS_NEED_POSITION_WS |
|
$Varyings.normalWS: #define VARYINGS_NEED_NORMAL_WS |
|
$Varyings.viewDirectionWS: #define VARYINGS_NEED_VIEWDIRECTION_WS |
|
$Varyings.tangentWS: #define VARYINGS_NEED_TANGENT_WS |
|
$Varyings.texCoord0: #define VARYINGS_NEED_TEXCOORD0 |
|
$Varyings.texCoord1: #define VARYINGS_NEED_TEXCOORD1 |
|
$Varyings.texCoord2: #define VARYINGS_NEED_TEXCOORD2 |
|
$Varyings.texCoord3: #define VARYINGS_NEED_TEXCOORD3 |
|
$Varyings.color: #define VARYINGS_NEED_COLOR |
|
$Varyings.fogFactorAndVertexLight: #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT |
|
$Varyings.sh: #define VARYINGS_NEED_SH |
|
$Varyings.staticLightmapUV: #define VARYINGS_NEED_STATIC_LIGHTMAP_UV |
|
$Varyings.dynamicLightmapUV: #define VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV |
|
$Varyings.shadowCoord: #define VARYINGS_NEED_SHADOW_COORD |
|
|
|
$features.graphVertex: #define HAVE_MESH_MODIFICATION |
|
|
|
$SurfaceDescriptionInputs.FaceSign: // Define when IsFontFaceNode is included in ShaderGraph |
|
$SurfaceDescriptionInputs.FaceSign: #define VARYINGS_NEED_CULLFACE |
|
|
|
$splice(GraphDefines) |
|
|
|
$splice(HybridV1InjectedBuiltinProperties) |
|
|
|
// -- 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 Functions |
|
$splice(GraphFunctions) |
|
|
|
// Graph Vertex |
|
$splice(GraphVertex) |
|
|
|
// Graph Pixel |
|
$splice(GraphPixel) |
|
|
|
// -------------------------------------------------- |
|
// Build Graph Inputs |
|
|
|
$features.graphVertex: $include("VertexAnimation.template.hlsl") |
|
$features.graphPixel: $include("SharedCode.template.hlsl") |
|
$features.graphPixel: $include("BuildSurfaceDescriptionInputs.template.hlsl") |
|
|
|
// -------------------------------------------------- |
|
// Build Surface Data |
|
|
|
uint2 ComputeFadeMaskSeed(uint2 positionSS) |
|
{ |
|
uint2 fadeMaskSeed; |
|
|
|
// Can't use the view direction, it is the same across the entire screen. |
|
fadeMaskSeed = positionSS; |
|
|
|
return fadeMaskSeed; |
|
} |
|
|
|
void GetSurfaceData(Varyings input, uint2 positionSS, float angleFadeFactor, out DecalSurfaceData surfaceData) |
|
{ |
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) |
|
half4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld); |
|
half 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]); |
|
$Varyings.texCoord0: input.texCoord0.xy = input.texCoord0.xy * scale + offset; |
|
$Varyings.texCoord1: input.texCoord1.xy = input.texCoord1.xy * scale + offset; |
|
$Varyings.texCoord2: input.texCoord2.xy = input.texCoord2.xy * scale + offset; |
|
$Varyings.texCoord3: input.texCoord3.xy = input.texCoord3.xy * scale + offset; |
|
half3 normalWS = TransformObjectToWorldDir(half3(0, 1, 0)); |
|
half3 tangentWS = TransformObjectToWorldDir(half3(1, 0, 0)); |
|
half3 bitangentWS = TransformObjectToWorldDir(half3(0, 0, 1)); |
|
half sign = dot(cross(normalWS, tangentWS), bitangentWS) > 0 ? 1 : -1; |
|
$Varyings.normalWS: input.normalWS.xyz = normalWS; |
|
$Varyings.tangentWS: input.tangentWS.xyzw = half4(tangentWS, sign); |
|
#else |
|
#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group |
|
LODDitheringTransition(ComputeFadeMaskSeed(positionSS), unity_LODFade.x); |
|
#endif |
|
|
|
half fadeFactor = half(1.0); |
|
#endif |
|
|
|
SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(input); |
|
SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); |
|
|
|
// setup defaults -- these are used if the graph doesn't output a value |
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData); |
|
surfaceData.occlusion = half(1.0); |
|
surfaceData.smoothness = half(0); |
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL |
|
surfaceData.normalWS.w = half(1.0); |
|
#else |
|
surfaceData.normalWS.w = half(0.0); |
|
#endif |
|
|
|
$SurfaceDescription.Emission: surfaceData.emissive.rgb = half3(surfaceDescription.Emission.rgb * fadeFactor); |
|
|
|
// copy across graph values, if defined |
|
$SurfaceDescription.BaseColor: surfaceData.baseColor.xyz = half3(surfaceDescription.BaseColor); |
|
$SurfaceDescription.Alpha: surfaceData.baseColor.w = half(surfaceDescription.Alpha * fadeFactor); |
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) |
|
#if defined(_MATERIAL_AFFECTS_NORMAL) |
|
$SurfaceDescription.NormalTS: surfaceData.normalWS.xyz = mul((half3x3)normalToWorld, surfaceDescription.NormalTS.xyz); |
|
#else |
|
surfaceData.normalWS.xyz = normalToWorld[2].xyz; |
|
#endif |
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH) |
|
#if defined(_MATERIAL_AFFECTS_NORMAL) |
|
float sgn = input.tangentWS.w; // should be either +1 or -1 |
|
float3 bitangent = sgn * cross(input.normalWS.xyz, input.tangentWS.xyz); |
|
half3x3 tangentToWorld = half3x3(input.tangentWS.xyz, bitangent.xyz, input.normalWS.xyz); |
|
|
|
// 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, tangentToWorld)); |
|
#else |
|
surfaceData.normalWS.xyz = half3(input.normalWS); // Default to vertex normal |
|
#endif |
|
#endif |
|
|
|
$SurfaceDescription.NormalAlpha: surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor; |
|
|
|
// In case of Smoothness / AO / Metal, all the three are always computed but color mask can change |
|
$SurfaceDescription.Metallic: surfaceData.metallic = half(surfaceDescription.Metallic); |
|
$SurfaceDescription.Occlusion: surfaceData.occlusion = half(surfaceDescription.Occlusion); |
|
$SurfaceDescription.Smoothness: surfaceData.smoothness = half(surfaceDescription.Smoothness); |
|
$SurfaceDescription.MAOSAlpha: surfaceData.MAOSAlpha = half(surfaceDescription.MAOSAlpha * fadeFactor); |
|
} |
|
|
|
// -------------------------------------------------- |
|
// Main |
|
|
|
$splice(PostGraphIncludes) |
|
|
|
ENDHLSL |
|
}
|
|
|