// SPDX-FileCopyrightText: 2023 Unity Technologies and the glTFast authors
// SPDX-License-Identifier: Apache-2.0
#if USING_HDRP
using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using UnityEngine.Rendering;
#if USING_HDRP_10_OR_NEWER
using UnityEngine.Rendering.HighDefinition;
#endif
namespace GLTFast.Materials {
public class HighDefinitionRPMaterialGenerator : ShaderGraphMaterialGenerator {
// ReSharper disable MemberCanBePrivate.Global
/// DistortionVectors shader pass name
public const string DistortionVectorsPass = "DistortionVectors";
/// _CullModeForward shader property identifier
public static readonly int CullModeForwardProperty = Shader.PropertyToID("_CullModeForward");
// ReSharper restore MemberCanBePrivate.Global
static readonly int k_ZTestDepthEqualForOpaque = Shader.PropertyToID("_ZTestDepthEqualForOpaque");
#if USING_HDRP_10_OR_NEWER
static readonly int k_RenderQueueType = Shader.PropertyToID("_RenderQueueType");
const string k_DoubleSidedOnKeyword = "_DOUBLESIDED_ON";
static readonly int k_DoubleSidedNormalModePropId = Shader.PropertyToID("_DoubleSidedNormalMode");
static readonly int k_DoubleSidedConstantsPropId = Shader.PropertyToID("_DoubleSidedConstants");
#if UNITY_EDITOR
/// GUID of the stack lit shader graph used for advanced PBR materials
public const string MetallicStackLitShaderGuid = "429ab83ee9ef05b4f8a76e58ea5d5ad4";
#endif
/// Name of the stack lit shader graph used for advanced PBR materials
public const string MetallicStackLitShader = "glTF-pbrMetallicRoughnessStackLit";
static bool s_MetallicStackLitShaderQueried;
static Shader s_MetallicStackLitShader;
#if !UNITY_SHADER_GRAPH_12_OR_NEWER
///
/// Forces non-legacy shader graph for HDRP 10.x
///
/// Shader features
/// Shader name
// TODO: Drop it when 2020 support is dropped
protected override string GetMetallicShaderName(MetallicShaderFeatures features) {
return MetallicShader;
}
///
/// Forces non-legacy shader graph for HDRP 10.x
///
/// Shader features
/// Shader name
protected override string GetSpecularShaderName(SpecularShaderFeatures features) {
return SpecularShader;
}
///
/// Forces non-legacy shader graph for HDRP 10.x
///
/// Shader features
/// Shader name
protected override string GetUnlitShaderName(UnlitShaderFeatures features) {
return UnlitShader;
}
#endif // !UNITY_SHADER_GRAPH_12_OR_NEWER
protected override void SetDoubleSided(Schema.MaterialBase gltfMaterial, Material material) {
base.SetDoubleSided(gltfMaterial,material);
material.EnableKeyword(k_DoubleSidedOnKeyword);
material.SetFloat(MaterialProperty.DoubleSidedEnable, 1);
// UnityEditor.Rendering.HighDefinition.DoubleSidedNormalMode.Flip
material.SetFloat(k_DoubleSidedNormalModePropId, 0);
material.SetVector(k_DoubleSidedConstantsPropId, new Vector4(-1,-1,-1,0));
material.SetFloat(MaterialProperty.CullMode, (int)CullMode.Off);
material.SetFloat(CullModeForwardProperty, (int)CullMode.Off);
}
#endif // USING_HDRP_10_OR_NEWER
protected override void SetAlphaModeMask(Schema.MaterialBase gltfMaterial, Material material) {
base.SetAlphaModeMask(gltfMaterial,material);
material.SetFloat(MaterialProperty.AlphaCutoffEnable, 1);
material.SetOverrideTag(MotionVectorTag, MotionVectorUser);
material.SetShaderPassEnabled(MotionVectorsPass, false);
if (gltfMaterial.Extensions?.KHR_materials_unlit != null) {
#if USING_HDRP_10_OR_NEWER
material.EnableKeyword(SurfaceTypeTransparentKeyword);
material.EnableKeyword(DisableSsrTransparentKeyword);
material.EnableKeyword(EnableFogOnTransparentKeyword);
material.SetShaderPassEnabled(ShaderPassTransparentDepthPrepass, false);
material.SetShaderPassEnabled(ShaderPassTransparentDepthPostpass, false);
material.SetShaderPassEnabled(ShaderPassTransparentBackface, false);
material.SetShaderPassEnabled(ShaderPassRayTracingPrepass, false);
material.SetShaderPassEnabled(ShaderPassDepthOnlyPass, false);
material.SetFloat(AlphaDstBlendProperty, (int)BlendMode.OneMinusSrcAlpha);//10
#endif // USING_HDRP_10_OR_NEWER
material.SetOverrideTag(RenderTypeTag,TransparentRenderType);
material.SetShaderPassEnabled(DistortionVectorsPass,false);
material.SetFloat(MaterialProperty.DstBlend, (int)BlendMode.OneMinusSrcAlpha);//10
material.SetFloat(MaterialProperty.SrcBlend, (int) BlendMode.One);
// material.SetFloat(k_RenderQueueType, 4);
// material.SetFloat(k_SurfaceType, 1);
material.SetFloat(k_ZTestDepthEqualForOpaque, (int)CompareFunction.LessEqual);
material.SetFloat(MaterialProperty.ZWrite, 0);
}
}
#if USING_HDRP_10_OR_NEWER
///
/// Picks more advanced StackLit based shader graph, if any material feature requires it.
///
/// Material features
/// Shader capable of rendering the features
protected override Shader GetMetallicShader(MetallicShaderFeatures features)
{
if ((features & MetallicShaderFeatures.ClearCoat) != 0)
{
if (!s_MetallicStackLitShaderQueried)
{
#if UNITY_EDITOR
s_MetallicStackLitShader = LoadShaderByGuid(new GUID(MetallicStackLitShaderGuid));
#else
s_MetallicStackLitShader = LoadShaderByName(MetallicStackLitShader);
#endif
if (s_MetallicStackLitShader == null)
{
// Fallback to regular shader graph
s_MetallicStackLitShader = base.GetMetallicShader(features);
}
s_MetallicStackLitShaderQueried = true;
}
return s_MetallicStackLitShader;
}
return base.GetMetallicShader(features);
}
protected override void SetShaderModeBlend(Schema.MaterialBase gltfMaterial, Material material) {
material.DisableKeyword(AlphaTestOnKeyword);
material.EnableKeyword(SurfaceTypeTransparentKeyword);
// material.EnableKeyword(KW_DISABLE_DECALS);
material.EnableKeyword(DisableSsrTransparentKeyword);
material.EnableKeyword(EnableFogOnTransparentKeyword);
material.SetOverrideTag(RenderTypeTag, TransparentRenderType);
material.SetShaderPassEnabled(ShaderPassTransparentDepthPrepass, false);
material.SetShaderPassEnabled(ShaderPassTransparentDepthPostpass, false);
material.SetShaderPassEnabled(ShaderPassTransparentBackface, false);
material.SetShaderPassEnabled(ShaderPassRayTracingPrepass, false);
material.SetShaderPassEnabled(ShaderPassDepthOnlyPass, false);
material.SetFloat(MaterialProperty.AlphaCutoffEnable, 0);
material.SetFloat(k_RenderQueueType, (int)CustomPass.RenderQueueType.PreRefraction );// 4
material.SetFloat(MaterialProperty.SurfaceType, 1 );
material.SetFloat(MaterialProperty.ZWrite, 0);
material.SetFloat(ZTestGBufferProperty, (int)CompareFunction.LessEqual); //4
material.SetFloat(k_ZTestDepthEqualForOpaque, (int)CompareFunction.LessEqual); //4
material.SetFloat(AlphaDstBlendProperty, (int)BlendMode.OneMinusSrcAlpha);//10
material.SetFloat(MaterialProperty.DstBlend, (int)BlendMode.OneMinusSrcAlpha);//10
material.SetFloat(MaterialProperty.SrcBlend, (int) BlendMode.SrcAlpha);//5
#if UNITY_2021_1_OR_NEWER
material.SetFloat(MaterialProperty.EnableBlendModePreserveSpecularLighting, 0);
#endif
}
#endif // USING_HDRP_10_OR_NEWER
}
}
#endif // USING_URP