Created
November 28, 2021 13:44
-
-
Save LukasKastern/650315c05f27d3995b15f86075e50183 to your computer and use it in GitHub Desktop.
Extracted URP (v12.1) DBufferDecal shader from shader graph
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Shader "DBufferDecal" | |
{ | |
Properties | |
{ | |
[HideInInspector]_DrawOrder("Draw Order", Range(-50, 50)) = 0 | |
[HideInInspector][Enum(Depth Bias, 0, View Bias, 1)]_DecalMeshBiasType("DecalMesh BiasType", Float) = 0 | |
[HideInInspector]_DecalMeshDepthBias("DecalMesh DepthBias", Float) = 0 | |
[HideInInspector]_DecalMeshViewBias("DecalMesh ViewBias", Float) = 0 | |
[HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {} | |
[HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {} | |
[HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {} | |
} | |
SubShader | |
{ | |
Tags | |
{ | |
"RenderPipeline"="UniversalPipeline" | |
// RenderType: <None> | |
"PreviewType"="Plane" | |
// Queue: <None> | |
"ShaderGraphShader"="true" | |
"ShaderGraphTargetId"="" | |
} | |
Pass | |
{ | |
Name "DBufferProjector" | |
Tags | |
{ | |
"LightMode" = "DBufferProjector" | |
} | |
// Render State | |
Cull Front | |
Blend 0 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha | |
Blend 1 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha | |
Blend 2 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha | |
ZTest Greater | |
ZWrite Off | |
ColorMask RGBA | |
ColorMask RGBA 1 | |
ColorMask RGBA 2 | |
// -------------------------------------------------- | |
// Pass | |
HLSLPROGRAM | |
// Pragmas | |
#pragma target 3.5 | |
#pragma vertex Vert | |
#pragma fragment Frag | |
#pragma multi_compile_instancing | |
// Keywords | |
#pragma multi_compile _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" | |
// Defines | |
#define HAVE_MESH_MODIFICATION | |
#define SHADERPASS SHADERPASS_DBUFFER_PROJECTOR | |
#define _MATERIAL_AFFECTS_ALBEDO 1 | |
#define _MATERIAL_AFFECTS_NORMAL 1 | |
#define _MATERIAL_AFFECTS_NORMAL_BLEND 1 | |
#define _MATERIAL_AFFECTS_MAOS 1 | |
// HybridV1InjectedBuiltinProperties: <None> | |
// -- Properties used by ScenePickingPass | |
#ifdef SCENEPICKINGPASS | |
float4 _SelectionID; | |
#endif | |
// Includes | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl" | |
// -------------------------------------------------- | |
// Structs and Packing | |
struct Attributes | |
{ | |
float3 positionOS : POSITION; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
uint instanceID : INSTANCEID_SEMANTIC; | |
#endif | |
}; | |
struct Varyings | |
{ | |
float4 positionCS : SV_POSITION; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
uint instanceID : CUSTOM_INSTANCE_ID; | |
#endif | |
#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) | |
uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; | |
#endif | |
#if (defined(UNITY_STEREO_INSTANCING_ENABLED)) | |
uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; | |
#endif | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; | |
#endif | |
}; | |
struct SurfaceDescriptionInputs | |
{ | |
float3 TangentSpaceNormal; | |
}; | |
struct VertexDescriptionInputs | |
{ | |
}; | |
struct PackedVaryings | |
{ | |
float4 positionCS : SV_POSITION; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
uint instanceID : CUSTOM_INSTANCE_ID; | |
#endif | |
#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) | |
uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; | |
#endif | |
#if (defined(UNITY_STEREO_INSTANCING_ENABLED)) | |
uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; | |
#endif | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; | |
#endif | |
}; | |
PackedVaryings PackVaryings(Varyings input) | |
{ | |
PackedVaryings output; | |
ZERO_INITIALIZE(PackedVaryings, output); | |
output.positionCS = input.positionCS; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
output.instanceID = input.instanceID; | |
#endif | |
#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) | |
output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; | |
#endif | |
#if (defined(UNITY_STEREO_INSTANCING_ENABLED)) | |
output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; | |
#endif | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
output.cullFace = input.cullFace; | |
#endif | |
return output; | |
} | |
Varyings UnpackVaryings(PackedVaryings input) | |
{ | |
Varyings output; | |
output.positionCS = input.positionCS; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
output.instanceID = input.instanceID; | |
#endif | |
#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) | |
output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; | |
#endif | |
#if (defined(UNITY_STEREO_INSTANCING_ENABLED)) | |
output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; | |
#endif | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
output.cullFace = input.cullFace; | |
#endif | |
return output; | |
} | |
// -------------------------------------------------- | |
// Graph | |
// Graph Properties | |
CBUFFER_START(UnityPerMaterial) | |
float _DrawOrder; | |
float _DecalMeshBiasType; | |
float _DecalMeshDepthBias; | |
float _DecalMeshViewBias; | |
CBUFFER_END | |
// Object and Global properties | |
// Graph Vertex | |
struct VertexDescription | |
{ | |
}; | |
VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) | |
{ | |
VertexDescription description = (VertexDescription)0; | |
return description; | |
} | |
// Graph Pixel | |
struct SurfaceDescription | |
{ | |
float3 BaseColor; | |
float Alpha; | |
float3 NormalTS; | |
float NormalAlpha; | |
float Metallic; | |
float Occlusion; | |
float Smoothness; | |
float MAOSAlpha; | |
}; | |
SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) | |
{ | |
SurfaceDescription surface = (SurfaceDescription)0; | |
surface.BaseColor = float3(0, 0, 1); | |
surface.Alpha = 1; | |
surface.NormalTS = IN.TangentSpaceNormal; | |
surface.NormalAlpha = 1; | |
surface.Metallic = 0; | |
surface.Occlusion = 1; | |
surface.Smoothness = 1; | |
surface.MAOSAlpha = 0; | |
return surface; | |
} | |
SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) | |
{ | |
SurfaceDescriptionInputs output; | |
ZERO_INITIALIZE(SurfaceDescriptionInputs, output); | |
output.TangentSpaceNormal = float3(0.0f, 0.0f, 1.0f); | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
#define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN | |
output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); | |
#else | |
#define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN | |
#endif | |
#undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN | |
return output; | |
} | |
// -------------------------------------------------- | |
// 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, half3 viewDirectioWS, 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]); | |
#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 | |
// copy across graph values, if defined | |
surfaceData.baseColor.xyz = half3(surfaceDescription.BaseColor); | |
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) | |
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) | |
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, tangentToWorld)); | |
#else | |
surfaceData.normalWS.xyz = half3(input.normalWS); // Default to vertex normal | |
#endif | |
#endif | |
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor; | |
// In case of Smoothness / AO / Metal, all the three are always computed but color mask can change | |
surfaceData.metallic = half(surfaceDescription.Metallic); | |
surfaceData.occlusion = half(surfaceDescription.Occlusion); | |
surfaceData.smoothness = half(surfaceDescription.Smoothness); | |
surfaceData.MAOSAlpha = half(surfaceDescription.MAOSAlpha * fadeFactor); | |
} | |
// -------------------------------------------------- | |
// Main | |
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPassDecal.hlsl" | |
ENDHLSL | |
} | |
Pass | |
{ | |
Name "ScenePickingPass" | |
Tags | |
{ | |
"LightMode" = "Picking" | |
} | |
// Render State | |
Cull Back | |
// Debug | |
// <None> | |
// -------------------------------------------------- | |
// Pass | |
HLSLPROGRAM | |
// Pragmas | |
#pragma target 3.5 | |
#pragma vertex Vert | |
#pragma fragment Frag | |
#pragma multi_compile_instancing | |
// Keywords | |
// PassKeywords: <None> | |
// GraphKeywords: <None> | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" | |
// Defines | |
#define HAVE_MESH_MODIFICATION | |
#define SHADERPASS SHADERPASS_DEPTHONLY | |
#define SCENEPICKINGPASS 1 | |
// HybridV1InjectedBuiltinProperties: <None> | |
// -- Properties used by ScenePickingPass | |
#ifdef SCENEPICKINGPASS | |
float4 _SelectionID; | |
#endif | |
// Includes | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" | |
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl" | |
// -------------------------------------------------- | |
// Structs and Packing | |
struct Attributes | |
{ | |
float3 positionOS : POSITION; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
uint instanceID : INSTANCEID_SEMANTIC; | |
#endif | |
}; | |
struct Varyings | |
{ | |
float4 positionCS : SV_POSITION; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
uint instanceID : CUSTOM_INSTANCE_ID; | |
#endif | |
#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) | |
uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; | |
#endif | |
#if (defined(UNITY_STEREO_INSTANCING_ENABLED)) | |
uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; | |
#endif | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; | |
#endif | |
}; | |
struct SurfaceDescriptionInputs | |
{ | |
}; | |
struct VertexDescriptionInputs | |
{ | |
}; | |
struct PackedVaryings | |
{ | |
float4 positionCS : SV_POSITION; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
uint instanceID : CUSTOM_INSTANCE_ID; | |
#endif | |
#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) | |
uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0; | |
#endif | |
#if (defined(UNITY_STEREO_INSTANCING_ENABLED)) | |
uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex; | |
#endif | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC; | |
#endif | |
}; | |
PackedVaryings PackVaryings(Varyings input) | |
{ | |
PackedVaryings output; | |
ZERO_INITIALIZE(PackedVaryings, output); | |
output.positionCS = input.positionCS; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
output.instanceID = input.instanceID; | |
#endif | |
#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) | |
output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; | |
#endif | |
#if (defined(UNITY_STEREO_INSTANCING_ENABLED)) | |
output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; | |
#endif | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
output.cullFace = input.cullFace; | |
#endif | |
return output; | |
} | |
Varyings UnpackVaryings(PackedVaryings input) | |
{ | |
Varyings output; | |
output.positionCS = input.positionCS; | |
#if UNITY_ANY_INSTANCING_ENABLED | |
output.instanceID = input.instanceID; | |
#endif | |
#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE))) | |
output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0; | |
#endif | |
#if (defined(UNITY_STEREO_INSTANCING_ENABLED)) | |
output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx; | |
#endif | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
output.cullFace = input.cullFace; | |
#endif | |
return output; | |
} | |
// -------------------------------------------------- | |
// Graph | |
// Graph Properties | |
CBUFFER_START(UnityPerMaterial) | |
float _DrawOrder; | |
float _DecalMeshBiasType; | |
float _DecalMeshDepthBias; | |
float _DecalMeshViewBias; | |
CBUFFER_END | |
// Object and Global properties | |
// Graph Functions | |
// GraphFunctions: <None> | |
// Graph Vertex | |
struct VertexDescription | |
{ | |
}; | |
VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN) | |
{ | |
VertexDescription description = (VertexDescription)0; | |
return description; | |
} | |
// Graph Pixel | |
struct SurfaceDescription | |
{ | |
}; | |
SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN) | |
{ | |
SurfaceDescription surface = (SurfaceDescription)0; | |
return surface; | |
} | |
// -------------------------------------------------- | |
// Build Graph Inputs | |
// $features.graphVertex: $include("VertexAnimation.template.hlsl") | |
// ^ ERROR: $include cannot find file : VertexAnimation.template.hlsl. Looked into: | |
// Packages/com.unity.shadergraph/Editor/Generation/Templates | |
// $features.graphPixel: $include("SharedCode.template.hlsl") | |
// ^ ERROR: $include cannot find file : SharedCode.template.hlsl. Looked into: | |
// Packages/com.unity.shadergraph/Editor/Generation/Templates | |
SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) | |
{ | |
SurfaceDescriptionInputs output; | |
ZERO_INITIALIZE(SurfaceDescriptionInputs, output); | |
/* WARNING: $splice Could not find named fragment 'CustomInterpolatorCopyToSDI' */ | |
#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) | |
#define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); | |
#else | |
#define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN | |
#endif | |
#undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN | |
return output; | |
} | |
// -------------------------------------------------- | |
// 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, half3 viewDirectioWS, 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]); | |
#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 | |
// copy across graph values, if defined | |
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) | |
#if defined(_MATERIAL_AFFECTS_NORMAL) | |
#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) | |
#else | |
surfaceData.normalWS.xyz = half3(input.normalWS); // Default to vertex normal | |
#endif | |
#endif | |
// In case of Smoothness / AO / Metal, all the three are always computed but color mask can change | |
} | |
// -------------------------------------------------- | |
// Main | |
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPassDecal.hlsl" | |
ENDHLSL | |
} | |
} | |
FallBack "Hidden/Shader Graph/FallbackError" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment