From c7518579bebff6b492e2ae702fff2f2d589271d0 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Wed, 31 Jul 2024 01:38:33 +0900 Subject: [PATCH] Add UrpLitContext.UnsafeEditMode --- .../URP/ShaderUtil/Lit/UrpLitContext.cs | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/ShaderUtil/Lit/UrpLitContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/ShaderUtil/Lit/UrpLitContext.cs index f34d7e7fc..574d90cb9 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/ShaderUtil/Lit/UrpLitContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/ShaderUtil/Lit/UrpLitContext.cs @@ -63,13 +63,20 @@ namespace UniGLTF _mat = material; } + /// + /// これが有効な場合、Validate() 関数が呼ばれるべき場合でも自動的に呼ばれなくなります。 + /// + /// 処理最適化目的で使用できます。 + /// + public bool UnsafeEditMode { get; set; } = false; + public UrpLitWorkflowType WorkflowType { get => (UrpLitWorkflowType)_mat.GetFloat(WorkflowMode); set { _mat.SetFloat(WorkflowMode, (float)value); - ValidateShaderKeywords(); + if (!UnsafeEditMode) Validate(); } } @@ -79,7 +86,7 @@ namespace UniGLTF set { _mat.SetFloat(Surface, (float)value); - ValidateShaderKeywords(); + if (!UnsafeEditMode) Validate(); } } @@ -89,7 +96,7 @@ namespace UniGLTF set { _mat.SetFloat(Blend, (float)value); - ValidateShaderKeywords(); + if (!UnsafeEditMode) Validate(); } } @@ -99,7 +106,7 @@ namespace UniGLTF set { _mat.SetFloat(AlphaClip, value ? 1.0f : 0.0f); - ValidateShaderKeywords(); + if (!UnsafeEditMode) Validate(); } } @@ -156,7 +163,7 @@ namespace UniGLTF set { _mat.SetFloat(SmoothnessTextureChannelProp, (float)value); - ValidateShaderKeywords(); + if (!UnsafeEditMode) Validate(); } } @@ -217,11 +224,13 @@ namespace UniGLTF public Color EmissionLinear { get => _mat.GetColor(EmissionColor); + set => _mat.SetColor(EmissionColor, value); } public Texture EmissionTexture { get => _mat.GetTexture(EmissionMap); + set => _mat.SetTexture(EmissionMap, value); } public float OcclusionStrength @@ -257,9 +266,9 @@ namespace UniGLTF } /// - /// 複数のプロパティに関連して設定されるキーワードを更新する。 + /// 複数のプロパティに関連して設定されるキーワードやプロパティなどを更新する /// - public void ValidateShaderKeywords() + public void Validate() { // Workflow var workflowType = (UrpLitWorkflowType)_mat.GetFloat(WorkflowMode); @@ -275,15 +284,26 @@ namespace UniGLTF var surfaceType = (UrpLitSurfaceType)_mat.GetFloat(Surface); _mat.SetKeyword(SurfaceTypeTransparentKeyword, surfaceType != UrpLitSurfaceType.Opaque); - // Render Settings + // SmoothnessTextureChannel + var isOpaque = surfaceType == UrpLitSurfaceType.Opaque; + var smoothnessMapChannel = (UrpLitSmoothnessMapChannel)_mat.GetFloat(SmoothnessTextureChannelProp); + _mat.SetKeyword(SmoothnessTextureAlbedoChannelAKeyword, isOpaque && smoothnessMapChannel == UrpLitSmoothnessMapChannel.AlbedoAlpha); + + // Alpha Clip var alphaClip = _mat.GetFloat(AlphaClip) >= 0.5f; - var blendMode = (UrpLitBlendMode)_mat.GetFloat(Blend); - var zWrite = surfaceType == UrpLitSurfaceType.Opaque; _mat.SetKeyword(AlphaTestOnKeyword, alphaClip); + + // Blend Mode + var blendMode = (UrpLitBlendMode)_mat.GetFloat(Blend); _mat.SetKeyword(AlphaPremultiplyOnKeyword, blendMode == UrpLitBlendMode.Premultiply); _mat.SetKeyword(AlphaModulateOnKeyword, blendMode == UrpLitBlendMode.Additive); + + // ZWrite + var zWrite = surfaceType == UrpLitSurfaceType.Opaque; _mat.SetFloat(ZWrite, zWrite ? 1.0f : 0.0f); _mat.SetShaderPassEnabled("DepthOnly", zWrite); + + // Render Settings _mat.SetFloat(SrcBlend, (surfaceType, blendMode) switch { (UrpLitSurfaceType.Opaque, _) => (float)UnityEngine.Rendering.BlendMode.One, @@ -316,11 +336,6 @@ namespace UniGLTF (UrpLitSurfaceType.Transparent, _) => (int)RenderQueue.Transparent, _ => _mat.shader.renderQueue, }; - - // SmoothnessTextureChannel - var isOpaque = surfaceType == UrpLitSurfaceType.Opaque; - var smoothnessMapChannel = (UrpLitSmoothnessMapChannel)_mat.GetFloat(SmoothnessTextureChannelProp); - _mat.SetKeyword(SmoothnessTextureAlbedoChannelAKeyword, isOpaque && smoothnessMapChannel == UrpLitSmoothnessMapChannel.AlbedoAlpha); } } } \ No newline at end of file