From 5d67238c8fbfec2135d1fff3fb09b07b6c29b315 Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Thu, 7 Dec 2023 10:55:50 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=B0=81=E8=A3=85=E5=AF=B9sh?= =?UTF-8?q?ader=E7=9A=84=E7=AE=A1=E7=90=86=E5=92=8C=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一封装对shader的管理和示例。 --- .../HotFix/GameLogic/Common/Shader.meta | 8 + .../Common/Shader/ActorShaderGroup.cs | 49 ++++++ .../Common/Shader/ActorShaderGroup.cs.meta | 3 + .../GameLogic/Common/Shader/ActorShaderMgr.cs | 117 +++++++++++++ .../Common/Shader/ActorShaderMgr.cs.meta | 3 + .../HotFix/GameLogic/Common/Shader/TShader.cs | 154 ++++++++++++++++++ .../GameLogic/Common/Shader/TShader.cs.meta | 3 + 7 files changed, 337 insertions(+) create mode 100644 UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader.meta create mode 100644 UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderGroup.cs create mode 100644 UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderGroup.cs.meta create mode 100644 UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderMgr.cs create mode 100644 UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderMgr.cs.meta create mode 100644 UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/TShader.cs create mode 100644 UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/TShader.cs.meta diff --git a/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader.meta b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader.meta new file mode 100644 index 00000000..b19ac3f8 --- /dev/null +++ b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 123e7155051957847883c574bf957c7f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderGroup.cs b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderGroup.cs new file mode 100644 index 00000000..492b4a31 --- /dev/null +++ b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderGroup.cs @@ -0,0 +1,49 @@ +using UnityEngine; + +namespace TEngine +{ + /// + /// 封装一个角色可能用到的各种shader场景。 + /// + class ActorShaderGroup + { + private readonly TShader[] _allShader = new TShader[(int)ActorShaderEnvType.EnvTypeMax]; + + /// + /// 增加Shader到角色Shader分组。 + /// + /// 当前环境类型。 + /// TShader。 + public void AddShader(ActorShaderEnvType shaderType, TShader shader) + { + _allShader[(int)shaderType] = shader; + } + + /// + /// 根据当前环境获取Shader。 + /// + /// 当前环境类型。 + /// TShader。 + public TShader GetShader(ActorShaderEnvType type) + { + return _allShader[(int)type]; + } + + /// + /// 判断是否符合shader集合。 + /// + /// Shader实例。 + /// 是否符合。 + public bool IsMatch(Shader shader) + { + foreach (var dodShader in _allShader) + { + if (dodShader != null && dodShader.Shader == shader) + { + return true; + } + } + return false; + } + } +} \ No newline at end of file diff --git a/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderGroup.cs.meta b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderGroup.cs.meta new file mode 100644 index 00000000..ee2d57fd --- /dev/null +++ b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderGroup.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 79b6e5be73e14c929b6a3b4a980976ac +timeCreated: 1701916950 \ No newline at end of file diff --git a/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderMgr.cs b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderMgr.cs new file mode 100644 index 00000000..ae4e118c --- /dev/null +++ b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderMgr.cs @@ -0,0 +1,117 @@ +using GameBase; +using UnityEngine; + +namespace TEngine +{ + enum ActorShaderGroupType + { + /// + /// 通用的角色shader + /// + Brdf = 0, + + /// + /// 眼睛 + /// + BrdfEye, + + ///可能后面扩展,比如特效的特殊角色材质 + GroupMax, + } + + enum ActorShaderEnvType + { + /// + /// 游戏内场景默认模型,不带阴影,不带xray,不透明效果 + /// + EnvNormal = 0, + + /// + /// 展示场景 + /// + EnvShow, + + /// + /// 带阴影 + /// + EnvShadow, + + /// + /// 带xray,默认也带Shadow + /// + EnvXRay, + + /// + /// 透明渐隐效果 + /// + EnvAlphaFade, + + /// + /// 展示场景没shadow + /// + EnvShow_NoShadow, + + EnvTypeMax + } + + /// + /// 角色Shader管理器。 + /// + class ActorShaderMgr : Singleton + { + private readonly ActorShaderGroup[] _allShaderGroup = new ActorShaderGroup[(int)ActorShaderGroupType.GroupMax]; + + public ActorShaderMgr() + { + CreateBrdfShader(); + } + + /// + /// 根据当前Render查找角色的Shader分组。 + /// + /// Render。 + /// 角色的Shader分组。 + public ActorShaderGroup FindShaderGroup(Renderer render) + { + var sharedMat = render.sharedMaterial; + if (sharedMat == null) + { + return null; + } + + var shader = sharedMat.shader; + foreach (var group in _allShaderGroup) + { + if (group != null && group.IsMatch(shader)) + { + return group; + } + } + return null; + } + + private void CreateBrdfShader() + { + //通用的效果 + var actorShader = new ActorShaderGroup(); + actorShader.AddShader(ActorShaderEnvType.EnvNormal, new TShader("TEngine/Actor/ActorBrdf",shaderLocation:"ActorBrdf")); + actorShader.AddShader(ActorShaderEnvType.EnvShow, new TShader("TEngine/Actor/Show/ActorBrdf",shaderLocation:"ActorBrdf_Show")); + actorShader.AddShader(ActorShaderEnvType.EnvShow_NoShadow, new TShader("TEngine/Actor/Show/ActorBrdf_NoShadow",shaderLocation:"ActorBrdf_NoShadow")); + actorShader.AddShader(ActorShaderEnvType.EnvShadow, new TShader("TEngine/Actor/ActorBrdf",shaderLocation:"ActorBrdf_Normal")); + actorShader.AddShader(ActorShaderEnvType.EnvXRay, new TShader("TEngine/Actor/X-Ray",shaderLocation:"X-Ray")); + actorShader.AddShader(ActorShaderEnvType.EnvAlphaFade, new TShader("TEngine/Actor/Fade/ActorBrdf",shaderLocation:"ActorBrdf_Fade")); + _allShaderGroup[(int)ActorShaderGroupType.Brdf] = actorShader; + + + //眼睛效果 + actorShader = new ActorShaderGroup(); + actorShader.AddShader(ActorShaderEnvType.EnvNormal, new TShader("TEngine/Actor/ActorEye",shaderLocation:"ActorEye")); + actorShader.AddShader(ActorShaderEnvType.EnvShow, new TShader("TEngine/Actor/Show/ActorEye",shaderLocation:"ActorEye_Show", "MRT_DISABLE", "MRT_ENABLE")); + actorShader.AddShader(ActorShaderEnvType.EnvShadow, new TShader("TEngine/Actor/ActorEye",shaderLocation:"ActorEye")); + actorShader.AddShader(ActorShaderEnvType.EnvXRay, new TShader("TEngine/Actor/ActorEye",shaderLocation:"ActorEye")); + actorShader.AddShader(ActorShaderEnvType.EnvAlphaFade, new TShader("TEngine/Actor/Fade/ActorEye",shaderLocation:"ActorEye_Fade")); + + _allShaderGroup[(int)ActorShaderGroupType.BrdfEye] = actorShader; + } + } +} \ No newline at end of file diff --git a/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderMgr.cs.meta b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderMgr.cs.meta new file mode 100644 index 00000000..d75c41bd --- /dev/null +++ b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/ActorShaderMgr.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5a38b9b4bee84fabb1ef8db5292a6db6 +timeCreated: 1701916853 \ No newline at end of file diff --git a/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/TShader.cs b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/TShader.cs new file mode 100644 index 00000000..1c2ac63a --- /dev/null +++ b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/TShader.cs @@ -0,0 +1,154 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace TEngine +{ + /// + /// TShader scripts used for all rendering. + /// 统一封装对shader的管理。 + /// + public class TShader + { + private bool _loaded; + private Shader _shader; + private readonly string _shaderName; + private readonly string _shaderLocation; + private readonly List _keywordOn = new List(); + private readonly List _keywordOff = new List(); + + /// + /// Shader scripts used for all rendering. + /// + public Shader Shader + { + get + { + if (!_loaded) + { + _loaded = true; + _shader = FindShader(_shaderLocation,_shaderName); + + if (_shader == null) + { + Log.Error($"invalid shader path: {_shaderLocation}, shader name {_shaderName}"); + } + } + + return _shader; + } + } + + /// + /// 查找Shader。 + /// + /// Shader定位地址。 + /// Shader名称。 + /// Shader实例。 + public static Shader FindShader(string shaderLocation,string shaderName) + { + Shader shader = GameModule.Resource.LoadAsset(shaderLocation); + if (shader != null) + { + return shader; + } + return Shader.Find(shaderName); + } + + /// + /// TShader构造函数。 + /// + /// shader名称。 + /// shader路径。 + public TShader(string shaderName, string shaderLocation) + { + _shaderName = shaderName; + _shaderLocation = shaderLocation; + _shader = null; + } + + /// + /// TShader构造函数。 + /// + /// shader名称。 + /// shader路径。 + /// 开启选项。 + /// 关闭选项。 + public TShader(string shaderName, string shaderLocation, string keywordOn, string keywordOff) + { + _shaderName = shaderName; + _shaderLocation = shaderLocation; + _shader = null; + _keywordOn.Add(keywordOn); + _keywordOff.Add(keywordOff); + } + + /// + /// TShader构造函数。 + /// + /// shader名称。 + /// shader路径。 + /// 开启选项。 + /// 关闭选项。 + public TShader(string shaderName, string shaderLocation, string[] keywordOn, string[] keywordOff) + { + _shaderName = shaderName; + _shaderLocation = shaderLocation; + _shader = null; + _keywordOn.AddRange(keywordOn); + _keywordOff.AddRange(keywordOff); + } + + /// + /// 设置Shader效果。 + /// + /// 渲染对象。 + public void ApplyRender(Renderer render) + { + var sharedMat = render.sharedMaterial; + if (sharedMat != null) + { + //copy一份材质 + sharedMat = render.material; + sharedMat.shader = Shader; + + foreach (var keyword in _keywordOff) + { + sharedMat.DisableKeyword(keyword); + } + + foreach (var keyword in _keywordOn) + { + sharedMat.EnableKeyword(keyword); + } + } + } + + /// + /// 清除shader。 + /// + /// 渲染对象。 + public void ClearRender(Renderer render) + { + if (_keywordOff.Count <= 0 && _keywordOn.Count <= 0) + { + return; + } + + var sharedMat = render.sharedMaterial; + if (sharedMat != null) + { + //copy一份材质。 + sharedMat = render.material; + for (int k = 0; k < _keywordOn.Count; k++) + { + sharedMat.DisableKeyword(_keywordOn[k]); + } + + for (int k = 0; k < _keywordOff.Count; k++) + { + sharedMat.EnableKeyword(_keywordOff[k]); + } + } + } + } +} \ No newline at end of file diff --git a/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/TShader.cs.meta b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/TShader.cs.meta new file mode 100644 index 00000000..73a0252d --- /dev/null +++ b/UnityProject/Assets/GameScripts/HotFix/GameLogic/Common/Shader/TShader.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e219233984c14f7d97bc744c07fe13d0 +timeCreated: 1698115491 \ No newline at end of file