Shader "HDRenderPipeline/ExperimentalHair" { Properties { [Enum(Skin, 0, Hair, 1, Eye, 2)] _CharacterMaterialID("CharacterMaterialID", Int) = 0 //TODO: Move to gui _PrimarySpecular("PrimarySpecular", Range(0.0, 1.0)) = 0.8 _SecondarySpecular("SecondarySpecular", Range(0.0, 1.0)) = 0.5 _PrimarySpecularShift("PrimarySpecularShift", Range(-1.0, 1.0)) = 0.0 _SecondarySpecularShift("SecondarySpecularShift", Range(-1.0, 1.0)) = 0.0 _SpecularTint("SpecularTint", Color) = (1.0, 1.0, 1.0) _Scatter("Scatter", Range(0.0, 1.0)) = 0.7 // Following set of parameters represent the parameters node inside the MaterialGraph. // They are use to fill a SurfaceData. With a MaterialGraph this should not exist. // Reminder. Color here are in linear but the UI (color picker) do the conversion sRGB to linear [ToggleOff] _HairSprays("Hair Sprays", Float) = 0.0 _DiffuseColor("DiffuseColor", Color) = (1,1,1,1) _DiffuseColorMap("DiffuseColorMap", 2D) = "white" {} _Smoothness("Smoothness", Range(0.0, 1.0)) = 1.0 _MaskMap("MaskMap", 2D) = "white" {} _SpecularOcclusionMap("SpecularOcclusion", 2D) = "white" {} _NormalMap("NormalMap", 2D) = "bump" {} _NormalScale("_NormalScale", Range(0.0, 2.0)) = 1 _DetailMap("DetailMap", 2D) = "black" {} _DetailMask("DetailMask", 2D) = "white" {} _DetailAlbedoScale("_DetailAlbedoScale", Range(-2.0, 2.0)) = 1 _DetailNormalScale("_DetailNormalScale", Range(0.0, 2.0)) = 1 _DetailSmoothnessScale("_DetailSmoothnessScale", Range(-2.0, 2.0)) = 1 _TangentMap("TangentMap", 2D) = "bump" {} _Anisotropy("Anisotropy", Range(0.0, 1.0)) = 0 _AnisotropyMap("AnisotropyMap", 2D) = "white" {} // Wind [ToggleOff] _EnableWind("Enable Wind", Float) = 0.0 _InitialBend("Initial Bend", float) = 1.0 _Stiffness("Stiffness", float) = 1.0 _Drag("Drag", float) = 1.0 _ShiverDrag("Shiver Drag", float) = 0.2 _ShiverDirectionality("Shiver Directionality", Range(0.0, 1.0)) = 0.5 _EmissiveColor("EmissiveColor", Color) = (0, 0, 0) _EmissiveColorMap("EmissiveColorMap", 2D) = "white" {} _EmissiveIntensity("EmissiveIntensity", Float) = 0 [ToggleOff] _DepthOffsetEnable("Depth Offset View space", Float) = 0.0 [ToggleOff] _AlphaCutoffEnable("Alpha Cutoff Enable", Float) = 1.0 _AlphaCutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5 _AlphaCutoffShadow("Alpha Cutoff", Range(0.0, 1.0)) = 0.5 [ToggleOff] _TransparentDepthPrepassEnable("Alpha Cutoff Enable", Float) = 1.0 _AlphaCutoffPrepass("Alpha Cutoff", Range(0.0, 1.0)) = 0.5 _HorizonFade("Horizon fade", Range(0.0, 5.0)) = 1.0 // Blending state [HideInInspector] _SurfaceType("__surfacetype", Float) = 0.0 [HideInInspector] _BlendMode("__blendmode", Float) = 0.0 [HideInInspector] _SrcBlend("__src", Float) = 1.0 [HideInInspector] _DstBlend("__dst", Float) = 0.0 [HideInInspector] _ZWrite("__zw", Float) = 1.0 [HideInInspector] _CullMode("__cullmode", Float) = 2.0 [HideInInspector] _ZTestMode("_ZTestMode", Int) = 8 [ToggleOff] _DoubleSidedEnable("Double sided enable", Float) = 0.0 [ToggleOff] _DoubleSidedMirrorEnable("Double sided mirror enable", Float) = 1.0 [HideInInspector] _DoubleSidedConstants("_DoubleSidedConstants", Vector) = (1, 1, -1, 0) [Enum(UV0, 0, Planar, 1, TriPlanar, 2)] _UVBase("UV Set for base", Float) = 0 _TexWorldScale("Scale to apply on world coordinate", Float) = 1.0 [HideInInspector] _UVMappingMask("_UVMappingMask", Color) = (1, 0, 0, 0) [Enum(TangentSpace, 0, ObjectSpace, 1)] _NormalMapSpace("NormalMap space", Float) = 0 [Enum(UV0, 0, UV1, 1, UV2, 2, UV3, 3)] _UVDetail("UV Set for detail", Float) = 0 [HideInInspector] _UVDetailsMappingMask("_UVDetailsMappingMask", Color) = (1, 0, 0, 0) [Enum(Use Emissive Color, 0, Use Emissive Mask, 1)] _EmissiveColorMode("Emissive color mode", Float) = 1 // Caution: C# code in BaseHairUI.cs call LightmapEmissionFlagsProperty() which assume that there is an existing "_EmissionColor" // value that exist to identify if the GI emission need to be enabled. // In our case we don't use such a mechanism but need to keep the code quiet. We declare the value and always enable it. // TODO: Fix the code in legacy unity so we can customize the beahvior for GI _EmissionColor("Color", Color) = (1, 1, 1) } HLSLINCLUDE #pragma target 4.5 #pragma only_renderers d3d11 ps4 metal // TEMP: until we go futher in dev // #pragma enable_d3d11_debug_symbols //------------------------------------------------------------------------------------- // Variant //------------------------------------------------------------------------------------- #pragma shader_feature _ALPHATEST_ON #pragma shader_feature _DEPTHOFFSET_ON #pragma shader_feature _DOUBLESIDED_ON #pragma shader_feature _HAIRSPRAYS_ON #pragma shader_feature _ _MAPPING_PLANAR _MAPPING_TRIPLANAR #pragma shader_feature _NORMALMAP_TANGENT_SPACE #pragma shader_feature _ _REQUIRE_UV2 _REQUIRE_UV3 #pragma shader_feature _EMISSIVE_COLOR #pragma shader_feature _NORMALMAP #pragma shader_feature _MASKMAP #pragma shader_feature _SPECULAROCCLUSIONMAP #pragma shader_feature _EMISSIVE_COLOR_MAP #pragma shader_feature _TANGENTMAP #pragma shader_feature _ANISOTROPYMAP #pragma shader_feature _DETAIL_MAP #pragma shader_feature _VERTEX_WIND #pragma shader_feature _ _BLENDMODE_LERP _BLENDMODE_ADD _BLENDMODE_SOFT_ADD _BLENDMODE_MULTIPLY _BLENDMODE_PRE_MULTIPLY // Can we force a shader to not support lightmap ? #pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON #pragma multi_compile DIRLIGHTMAP_OFF DIRLIGHTMAP_COMBINED #pragma multi_compile DYNAMICLIGHTMAP_OFF DYNAMICLIGHTMAP_ON // enable dithering LOD crossfade #pragma multi_compile _ LOD_FADE_CROSSFADE // TODO: We should have this keyword only if VelocityInGBuffer is enable, how to do that ? //#pragma multi_compile VELOCITYOUTPUT_OFF VELOCITYOUTPUT_ON //------------------------------------------------------------------------------------- // Define //------------------------------------------------------------------------------------- #define UNITY_MATERIAL_HAIR // Need to be define before including Material.hlsl // Use surface gradient normal mapping as it handle correctly triplanar normal mapping and multiple UVSet #define SURFACE_GRADIENT //------------------------------------------------------------------------------------- // Include //------------------------------------------------------------------------------------- #include "../../../Core/ShaderLibrary/common.hlsl" #include "../../../Core/ShaderLibrary/Wind.hlsl" #include "../../ShaderPass/FragInputs.hlsl" #include "../../ShaderPass/ShaderPass.cs.hlsl" //------------------------------------------------------------------------------------- // variable declaration //------------------------------------------------------------------------------------- #include "../../Material/Hair/HairProperties.hlsl" // All our shaders use same name for entry point #pragma vertex Vert #pragma fragment Frag ENDHLSL SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" "PerformanceChecks"="False" } LOD 300 Pass { Name "Forward" // Name is not used Tags { "LightMode" = "Forward" } // This will be only for transparent object based on the RenderQueue index Blend [_SrcBlend] [_DstBlend] ZWrite [_ZWrite] Cull [_CullMode] HLSLPROGRAM #define SHADERPASS SHADERPASS_FORWARD #include "../../ShaderVariables.hlsl" #include "../../Lighting/Forward.hlsl" // TEMP until pragma work in include #pragma multi_compile LIGHTLOOP_SINGLE_PASS LIGHTLOOP_TILE_PASS #include "../../Lighting/Lighting.hlsl" #include "ShaderPass/HairSharePass.hlsl" #include "HairData.hlsl" #include "../../ShaderPass/ShaderPassForward.hlsl" ENDHLSL } Pass { Name "ForwardDisplayDebug" // Name is not used Tags{ "LightMode" = "ForwardDisplayDebug" } // This will be only for transparent object based on the RenderQueue index Blend[_SrcBlend][_DstBlend] ZWrite[_ZWrite] Cull[_CullMode] HLSLPROGRAM #define DEBUG_DISPLAY #define SHADERPASS SHADERPASS_FORWARD #include "../../ShaderVariables.hlsl" #include "../../Debug/DebugDisplay.hlsl" #include "../../Lighting/Forward.hlsl" // TEMP until pragma work in include #pragma multi_compile LIGHTLOOP_SINGLE_PASS LIGHTLOOP_TILE_PASS #include "../../Lighting/Lighting.hlsl" #include "ShaderPass/HairSharePass.hlsl" #include "HairData.hlsl" #include "../../ShaderPass/ShaderPassForward.hlsl" ENDHLSL } Pass { Name "TransparentDepthPrepass" Tags{ "LightMode" = "TransparentDepthPrepass" } Cull[_CullMode] ZWrite On HLSLPROGRAM #define SHADERPASS SHADERPASS_DEPTH_ONLY #define HAIR_TRANSPARENT_DEPTH_WRITE #include "../../ShaderVariables.hlsl" #include "../../Material/Material.hlsl" #include "ShaderPass/HairDepthPass.hlsl" #include "HairData.hlsl" #include "../../ShaderPass/ShaderPassDepthOnly.hlsl" ENDHLSL } Pass { Name "ShadowCaster" Tags{ "LightMode" = "ShadowCaster" } Cull[_CullMode] ZWrite On ZTest LEqual HLSLPROGRAM #define SHADERPASS SHADERPASS_SHADOWS #define USE_LEGACY_UNITY_MATRIX_VARIABLES #include "../../ShaderVariables.hlsl" #define HAIR_SHADOW #include "../../Material/Material.hlsl" #include "ShaderPass/HairDepthPass.hlsl" #include "HairData.hlsl" #include "../../ShaderPass/ShaderPassDepthOnly.hlsl" ENDHLSL } Pass { Name "Motion Vectors" Tags{ "LightMode" = "MotionVectors" } // Caution, this need to be call like this to setup the correct parameters by C++ (legacy Unity) Cull[_CullMode] ZWrite Off // TODO: Test Z equal here. HLSLPROGRAM #define SHADERPASS SHADERPASS_VELOCITY #include "../../ShaderVariables.hlsl" #include "../../Material/Material.hlsl" #include "ShaderPass/HairVelocityPass.hlsl" #include "HairData.hlsl" #include "../../ShaderPass/ShaderPassVelocity.hlsl" ENDHLSL } } CustomEditor "Experimental.Rendering.HDPipeline.CharacterGUI" //CustomEditor "Experimental.Rendering.HDPipeline.HairGUI" }