public static void AddDoubleSidedProperty(PropertyCollector collector, DoubleSidedMode mode = DoubleSidedMode.Enabled, DoubleSidedGIMode giMode = DoubleSidedGIMode.Auto) { var normalMode = ConvertDoubleSidedModeToDoubleSidedNormalMode(mode); collector.AddToggleProperty("_DoubleSidedEnable", mode != DoubleSidedMode.Disabled); collector.AddShaderProperty(new Vector1ShaderProperty { enumNames = { "Flip", "Mirror", "None" }, // values will be 0, 1 and 2 floatType = FloatType.Enum, overrideReferenceName = "_DoubleSidedNormalMode", hidden = true, overrideHLSLDeclaration = true, hlslDeclarationOverride = HLSLDeclaration.DoNotDeclare, value = (int)normalMode }); collector.AddShaderProperty(new Vector4ShaderProperty { overrideReferenceName = "_DoubleSidedConstants", hidden = true, overrideHLSLDeclaration = true, hlslDeclarationOverride = HLSLDeclaration.UnityPerMaterial, value = new Vector4(1, 1, -1, 0) }); collector.AddShaderProperty(new Vector1ShaderProperty { enumNames = { "Auto", "On", "Off" }, // values will be 0, 1 and 2 floatType = FloatType.Enum, overrideReferenceName = "_DoubleSidedGIMode", hidden = true, overrideHLSLDeclaration = true, hlslDeclarationOverride = HLSLDeclaration.DoNotDeclare, value = (int)giMode }); }
public static void AddDoubleSidedProperty(PropertyCollector collector, DoubleSidedMode mode = DoubleSidedMode.Enabled) { var normalMode = ConvertDoubleSidedModeToDoubleSidedNormalMode(mode); collector.AddToggleProperty("_DoubleSidedEnable", mode != DoubleSidedMode.Disabled); collector.AddShaderProperty(new Vector1ShaderProperty { enumNames = { "Flip", "Mirror", "None" }, // values will be 0, 1 and 2 floatType = FloatType.Enum, overrideReferenceName = "_DoubleSidedNormalMode", hidden = true, value = (int)normalMode }); collector.AddShaderProperty(new Vector4ShaderProperty { overrideReferenceName = "_DoubleSidedConstants", hidden = true, value = new Vector4(1, 1, -1, 0) }); }
protected void SetupMaterial(Material material) { // Note: keywords must be based on Material value not on MaterialProperty due to multi-edit & material animation // (MaterialProperty value might come from renderer material property block) bool alphaTestEnable = material.GetFloat(kAlphaCutoffEnabled) == 1.0; SurfaceType surfaceType = (SurfaceType)material.GetFloat(kSurfaceType); BlendMode blendMode = (BlendMode)material.GetFloat(kBlendMode); DoubleSidedMode doubleSidedMode = (DoubleSidedMode)material.GetFloat(kDoubleSidedMode); if (surfaceType == SurfaceType.Opaque) { material.SetOverrideTag("RenderType", alphaTestEnable ? "TransparentCutout" : ""); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.renderQueue = alphaTestEnable ? (int)UnityEngine.Rendering.RenderQueue.AlphaTest : -1; } else { material.SetOverrideTag("RenderType", "Transparent"); material.SetInt("_ZWrite", 0); material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent; switch (blendMode) { case BlendMode.Lerp: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); break; case BlendMode.Add: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); break; case BlendMode.SoftAdd: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusDstColor); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); break; case BlendMode.Multiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); break; case BlendMode.Premultiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); break; } } if (doubleSidedMode == DoubleSidedMode.None) { material.SetInt("_CullMode", (int)UnityEngine.Rendering.CullMode.Back); } else { material.SetInt("_CullMode", (int)UnityEngine.Rendering.CullMode.Off); } SetKeyword(material, "_ALPHATEST_ON", alphaTestEnable); SetupKeywordsForInputMaps(material); /* * // Setup lightmap emissive flags * MaterialGlobalIlluminationFlags flags = material.globalIlluminationFlags; * if ((flags & (MaterialGlobalIlluminationFlags.BakedEmissive | MaterialGlobalIlluminationFlags.RealtimeEmissive)) != 0) * { * flags &= ~MaterialGlobalIlluminationFlags.EmissiveIsBlack; * if (!shouldEmissionBeEnabled) * flags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack; * * material.globalIlluminationFlags = flags; * } */ }
public static DoubleSidedNormalMode ConvertDoubleSidedModeToDoubleSidedNormalMode(DoubleSidedMode shaderGraphMode) { switch (shaderGraphMode) { case DoubleSidedMode.FlippedNormals: return(DoubleSidedNormalMode.Flip); case DoubleSidedMode.MirroredNormals: return(DoubleSidedNormalMode.Mirror); case DoubleSidedMode.Enabled: case DoubleSidedMode.Disabled: default: return(DoubleSidedNormalMode.None); } }
protected void SetupMaterial(Material material) { // Note: keywords must be based on Material value not on MaterialProperty due to multi-edit & material animation // (MaterialProperty value might come from renderer material property block) bool alphaTestEnable = material.GetFloat(kAlphaCutoffEnabled) == 1.0; SurfaceType surfaceType = (SurfaceType)material.GetFloat(kSurfaceType); BlendMode blendMode = (BlendMode)material.GetFloat(kBlendMode); DoubleSidedMode doubleSidedMode = (DoubleSidedMode)material.GetFloat(kDoubleSidedMode); if (surfaceType == SurfaceType.Opaque) { material.SetOverrideTag("RenderType", alphaTestEnable ? "TransparentCutout" : ""); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.renderQueue = alphaTestEnable ? (int)UnityEngine.Rendering.RenderQueue.AlphaTest : -1; } else { material.SetOverrideTag("RenderType", "Transparent"); material.SetInt("_ZWrite", 0); material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent; switch (blendMode) { case BlendMode.Lerp: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); break; case BlendMode.Add: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); break; case BlendMode.SoftAdd: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusDstColor); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); break; case BlendMode.Multiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); break; case BlendMode.Premultiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); break; } } if (doubleSidedMode == DoubleSidedMode.None) { material.SetInt("_CullMode", (int)UnityEngine.Rendering.CullMode.Back); } else { material.SetInt("_CullMode", (int)UnityEngine.Rendering.CullMode.Off); } if (doubleSidedMode == DoubleSidedMode.DoubleSidedLightingFlip) { material.EnableKeyword("_DOUBLESIDED_LIGHTING_FLIP"); material.DisableKeyword("_DOUBLESIDED_LIGHTING_MIRROR"); } else if (doubleSidedMode == DoubleSidedMode.DoubleSidedLightingMirror) { material.DisableKeyword("_DOUBLESIDED_LIGHTING_FLIP"); material.EnableKeyword("_DOUBLESIDED_LIGHTING_MIRROR"); } else { material.DisableKeyword("_DOUBLESIDED_LIGHTING_FLIP"); material.DisableKeyword("_DOUBLESIDED_LIGHTING_MIRROR"); } SetKeyword(material, "_ALPHATEST_ON", alphaTestEnable); SetKeyword(material, "_NORMALMAP_TANGENT_SPACE", (NormalMapSpace)material.GetFloat(kNormalMapSpace) == NormalMapSpace.TangentSpace); SetKeyword(material, "_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A", ((SmoothnessMapChannel)material.GetFloat(kSmoothnessTextureChannelProp)) == SmoothnessMapChannel.AlbedoAlpha); SetKeyword(material, "_EMISSIVE_COLOR", ((EmissiveColorMode)material.GetFloat(kEmissiveColorMode)) == EmissiveColorMode.UseEmissiveColor); SetKeyword(material, "_HEIGHTMAP_AS_DISPLACEMENT", (HeightmapMode)material.GetFloat(kHeightMapMode) == HeightmapMode.Displacement); SetupKeywordsForInputMaps(material); /* * // Setup lightmap emissive flags * MaterialGlobalIlluminationFlags flags = material.globalIlluminationFlags; * if ((flags & (MaterialGlobalIlluminationFlags.BakedEmissive | MaterialGlobalIlluminationFlags.RealtimeEmissive)) != 0) * { * flags &= ~MaterialGlobalIlluminationFlags.EmissiveIsBlack; * if (!shouldEmissionBeEnabled) * flags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack; * * material.globalIlluminationFlags = flags; * } */ }
protected void SetupCommonOptionsKeywords(Material material) { // Note: keywords must be based on Material value not on MaterialProperty due to multi-edit & material animation // (MaterialProperty value might come from renderer material property block) bool alphaTestEnable = material.GetFloat(kAlphaCutoffEnabled) == 1.0; SurfaceType surfaceType = (SurfaceType)material.GetFloat(kSurfaceType); BlendMode blendMode = (BlendMode)material.GetFloat(kBlendMode); DoubleSidedMode doubleSidedMode = (DoubleSidedMode)material.GetFloat(kDoubleSidedMode); if (surfaceType == SurfaceType.Opaque) { material.SetOverrideTag("RenderType", alphaTestEnable ? "TransparentCutout" : ""); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.renderQueue = alphaTestEnable ? (int)UnityEngine.Rendering.RenderQueue.AlphaTest : -1; } else { material.SetOverrideTag("RenderType", "Transparent"); material.SetInt("_ZWrite", 0); material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent; switch (blendMode) { case BlendMode.Lerp: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); break; case BlendMode.Add: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); break; case BlendMode.SoftAdd: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusDstColor); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); break; case BlendMode.Multiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); break; case BlendMode.Premultiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); break; } } if (doubleSidedMode == DoubleSidedMode.None) { material.SetInt("_CullMode", (int)UnityEngine.Rendering.CullMode.Back); } else { material.SetInt("_CullMode", (int)UnityEngine.Rendering.CullMode.Off); } SetKeyword(material, "_ALPHATEST_ON", alphaTestEnable); bool distortionEnable = material.GetFloat(kDistortionEnable) == 1.0; bool distortionOnly = material.GetFloat(kDistortionOnly) == 1.0; bool distortionDepthTest = material.GetFloat(kDistortionDepthTest) == 1.0; if (distortionEnable) { material.SetShaderPassEnabled("DistortionVectors", true); } else { material.SetShaderPassEnabled("DistortionVectors", false); } if (distortionEnable && distortionOnly) { // Disable all passes except dbug material material.SetShaderPassEnabled("DebugViewMaterial", true); material.SetShaderPassEnabled("Meta", false); material.SetShaderPassEnabled("Forward", false); material.SetShaderPassEnabled("ForwardOnlyOpaque", false); } else { material.SetShaderPassEnabled("DebugViewMaterial", true); material.SetShaderPassEnabled("Meta", true); material.SetShaderPassEnabled("Forward", true); material.SetShaderPassEnabled("ForwardOnlyOpaque", true); } if (distortionDepthTest) { material.SetInt("_ZTestMode", (int)UnityEngine.Rendering.CompareFunction.LessEqual); } else { material.SetInt("_ZTestMode", (int)UnityEngine.Rendering.CompareFunction.Always); } SetKeyword(material, "_DISTORTION_ON", distortionEnable); SetupEmissionGIFlags(material); }
protected void SetupCommonOptionsKeywords(Material material) { bool alphaTestEnable = material.GetFloat(kAlphaCutoffEnabled) == 1.0; SurfaceType surfaceType = (SurfaceType)material.GetFloat(kSurfaceType); BlendMode blendMode = (BlendMode)material.GetFloat(kBlendMode); DoubleSidedMode doubleSidedMode = (DoubleSidedMode)material.GetFloat(kDoubleSidedMode); if (surfaceType == SurfaceType.Opaque) { material.SetOverrideTag("RenderType", alphaTestEnable ? "TransparentCutout" : ""); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.renderQueue = alphaTestEnable ? (int)UnityEngine.Rendering.RenderQueue.AlphaTest : -1; } else { material.SetOverrideTag("RenderType", "Transparent"); material.SetInt("_ZWrite", 0); material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent; switch (blendMode) { case BlendMode.Lerp: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); break; case BlendMode.Add: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); break; case BlendMode.SoftAdd: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusDstColor); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); break; case BlendMode.Multiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); break; case BlendMode.Premultiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); break; } } if (doubleSidedMode == DoubleSidedMode.None) { material.SetInt("_CullMode", (int)UnityEngine.Rendering.CullMode.Back); } else { material.SetInt("_CullMode", (int)UnityEngine.Rendering.CullMode.Off); } if (doubleSidedMode == DoubleSidedMode.DoubleSidedLightingFlip) { material.DisableKeyword("_DOUBLESIDED"); material.EnableKeyword("_DOUBLESIDED_LIGHTING_FLIP"); material.DisableKeyword("_DOUBLESIDED_LIGHTING_MIRROR"); } else if (doubleSidedMode == DoubleSidedMode.DoubleSidedLightingMirror) { material.DisableKeyword("_DOUBLESIDED"); material.DisableKeyword("_DOUBLESIDED_LIGHTING_FLIP"); material.EnableKeyword("_DOUBLESIDED_LIGHTING_MIRROR"); } else if (doubleSidedMode == DoubleSidedMode.DoubleSided) { material.EnableKeyword("_DOUBLESIDED"); material.DisableKeyword("_DOUBLESIDED_LIGHTING_FLIP"); material.DisableKeyword("_DOUBLESIDED_LIGHTING_MIRROR"); } else { material.DisableKeyword("_DOUBLESIDED"); material.DisableKeyword("_DOUBLESIDED_LIGHTING_FLIP"); material.DisableKeyword("_DOUBLESIDED_LIGHTING_MIRROR"); } SetKeyword(material, "_ALPHATEST_ON", alphaTestEnable); bool distortionEnable = material.GetFloat(kDistortionEnable) == 1.0; bool distortionOnly = material.GetFloat(kDistortionOnly) == 1.0; bool distortionDepthTest = material.GetFloat(kDistortionDepthTest) == 1.0; bool depthOffsetEnable = material.GetFloat(kDepthOffsetEnable) == 1.0; if (distortionEnable) { material.SetShaderPassEnabled("DistortionVectors", true); } else { material.SetShaderPassEnabled("DistortionVectors", false); } if (distortionEnable && distortionOnly) { // Disable all passes except dbug material material.SetShaderPassEnabled("GBuffer", false); material.SetShaderPassEnabled("DebugViewMaterial", true); material.SetShaderPassEnabled("Meta", false); material.SetShaderPassEnabled("ShadowCaster", false); material.SetShaderPassEnabled("DepthOnly", false); material.SetShaderPassEnabled("MotionVectors", false); material.SetShaderPassEnabled("Forward", false); } else { material.SetShaderPassEnabled("GBuffer", true); material.SetShaderPassEnabled("DebugViewMaterial", true); material.SetShaderPassEnabled("Meta", true); material.SetShaderPassEnabled("ShadowCaster", true); material.SetShaderPassEnabled("DepthOnly", true); material.SetShaderPassEnabled("MotionVectors", true); material.SetShaderPassEnabled("Forward", true); } if (distortionDepthTest) { material.SetInt("_ZTestMode", (int)UnityEngine.Rendering.CompareFunction.LessEqual); } else { material.SetInt("_ZTestMode", (int)UnityEngine.Rendering.CompareFunction.Always); } SetKeyword(material, "_DISTORTION_ON", distortionEnable); SetKeyword(material, "_DEPTHOFFSET_ON", depthOffsetEnable); SetupEmissionGIFlags(material); if (tessellationMode != null) { TessellationMode tessMode = (TessellationMode)material.GetFloat(kTessellationMode); if (tessMode == TessellationMode.Phong) { material.DisableKeyword("_TESSELLATION_DISPLACEMENT"); material.DisableKeyword("_TESSELLATION_DISPLACEMENT_PHONG"); } else if (tessMode == TessellationMode.Displacement) { material.EnableKeyword("_TESSELLATION_DISPLACEMENT"); material.DisableKeyword("_TESSELLATION_DISPLACEMENT_PHONG"); } else { material.DisableKeyword("_TESSELLATION_DISPLACEMENT"); material.EnableKeyword("_TESSELLATION_DISPLACEMENT_PHONG"); } bool tessellationObjectScaleEnable = material.GetFloat(kTessellationObjectScale) == 1.0; SetKeyword(material, "_TESSELLATION_OBJECT_SCALE", tessellationObjectScaleEnable); } }