diff --git a/Assets/TEngine/Runtime/GameFramework/Shader.meta b/Assets/TEngine/Runtime/GameFramework/Shader.meta new file mode 100644 index 00000000..85512fd5 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Shader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c626b7c1efe3edc428b44fbd255fb8fc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderGroup.cs b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderGroup.cs new file mode 100644 index 00000000..0685695f --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderGroup.cs @@ -0,0 +1,41 @@ +using UnityEngine; + +namespace TEngine +{ + /// + /// 封装一个角色可能用到的各种shader场景 + /// + class ActorShaderGroup + { + private readonly TShader[] _allShader = new TShader[(int)ActorShaderEnvType.EnvTypeMax]; + + public void AddShader(ActorShaderEnvType shaderType, TShader shader) + { + _allShader[(int)shaderType] = shader; + } + + public TShader GetShader(ActorShaderEnvType type) + { + return _allShader[(int)type]; + } + + /// + /// 判断是否符合shader集合。 + /// + /// + /// + public bool IsMatch(Shader shader) + { + for (int i = 0; i < _allShader.Length; i++) + { + var dodShader = _allShader[i]; + if (dodShader != null && dodShader.Shader == shader) + { + return true; + } + } + + return false; + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderGroup.cs.meta b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderGroup.cs.meta new file mode 100644 index 00000000..d6548dd4 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderGroup.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d86565c5f68a47bcae345c0ba306934e +timeCreated: 1683704019 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderMgr.cs b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderMgr.cs new file mode 100644 index 00000000..f6c2377a --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderMgr.cs @@ -0,0 +1,64 @@ +using UnityEngine; + +namespace TEngine +{ + /// + /// 统一管理ActorShader。 + /// + class ActorShaderMgr + { + private static ActorShaderMgr _instance; + + public static ActorShaderMgr Instance => _instance ??= new ActorShaderMgr(); + + private readonly ActorShaderGroup[] _allShaderGroup = new ActorShaderGroup[(int)ActorShaderGroupType.GroupMax]; + + public ActorShaderMgr() + { + RegisterShaderGroup(); + } + + 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; + } + + void RegisterShaderGroup() + { + //通用的效果 + var actorShader = new ActorShaderGroup(); + actorShader.AddShader(ActorShaderEnvType.EnvNormal, new TShader("TEngine/Actor/ActorNormal")); + actorShader.AddShader(ActorShaderEnvType.EnvShow, new TShader("TEngine/Actor/Show/ActorNormal")); + + actorShader.AddShader(ActorShaderEnvType.EnvShadow, new TShader("TEngine/Actor/ActorNormal")); + actorShader.AddShader(ActorShaderEnvType.EnvXRay, new TShader("TEngine/Actor/X-Ray")); + actorShader.AddShader(ActorShaderEnvType.EnvAlphaFade, new TShader("TEngine/Actor/Fade/ActorNormal")); + _allShaderGroup[(int)ActorShaderGroupType.Normal] = actorShader; + + //眼睛效果 + actorShader = new ActorShaderGroup(); + actorShader.AddShader(ActorShaderEnvType.EnvNormal, new TShader("TEngine/Actor/ActorEye")); + actorShader.AddShader(ActorShaderEnvType.EnvShow, new TShader("TEngine/Actor/Show/ActorEye", "MRT_DISABLE", "MRT_ENABLE")); + actorShader.AddShader(ActorShaderEnvType.EnvShadow, new TShader("TEngine/Actor/ActorEye")); + actorShader.AddShader(ActorShaderEnvType.EnvXRay, new TShader("TEngine/Actor/ActorEye")); + actorShader.AddShader(ActorShaderEnvType.EnvAlphaFade, new TShader("TEngine/Actor/Fade/ActorEye")); + + _allShaderGroup[(int)ActorShaderGroupType.NormalEye] = actorShader; + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderMgr.cs.meta b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderMgr.cs.meta new file mode 100644 index 00000000..1678e516 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderMgr.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 87ab4c41cc4745358e6e0f91ddd4c1db +timeCreated: 1683704043 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderType.cs b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderType.cs new file mode 100644 index 00000000..72138d00 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderType.cs @@ -0,0 +1,48 @@ +namespace TEngine +{ + enum ActorShaderEnvType + { + /// + /// 游戏内场景默认模型。 + /// + EnvNormal = 0, + + /// 。 + /// 展示场景。 + /// + EnvShow, + + /// + /// 带阴影。 + /// + EnvShadow, + + /// + /// 带xray,默认也带Shadow。 + /// + EnvXRay, + + /// + /// 透明渐隐效果。 + /// + EnvAlphaFade, + + EnvTypeMax + } + + enum ActorShaderGroupType + { + /// + /// 通用的角色shader。 + /// + Normal = 0, + + /// + /// 眼睛。 + /// + NormalEye, + + ///可能后面扩展,比如特效的特殊角色材质。 + GroupMax, + } +} \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderType.cs.meta b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderType.cs.meta new file mode 100644 index 00000000..74ab7f5a --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0b452c6b71ee47609c6530b6d8c8c8e1 +timeCreated: 1683703983 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs b/Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs new file mode 100644 index 00000000..4b8b3974 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs @@ -0,0 +1,145 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace TEngine +{ + /// + /// TShader scripts used for all rendering. + /// + class TShader + { + private bool _loaded; + private Shader _shader; + private readonly string _shaderPath; + private readonly List _keywordOn = new(); + private readonly List _keywordOff = new(); + + /// + /// Shader scripts used for all rendering. + /// + public Shader Shader + { + get + { + if (!_loaded) + { + _loaded = true; + _shader = FindShader(_shaderPath); + + if (_shader == null) + { + Debug.LogErrorFormat("invalid shader path: {0}", _shaderPath); + } + } + + return _shader; + } + } + + /// + /// 查找Shader。 + /// + /// Shader名字。 + /// Shader实例。 + public static Shader FindShader(string shaderName) + { + Shader shader = GameModule.Resource.LoadAsset(shaderName); + if (shader != null) + { + return shader; + } + return Shader.Find(shaderName); + } + + /// + /// TShader构造函数。 + /// + /// shader路径。 + public TShader(string shaderPath) + { + _shaderPath = shaderPath; + _shader = null; + } + + /// + /// TShader构造函数。 + /// + /// shader路径。 + /// 开启选项。 + /// 关闭选项。 + public TShader(string shaderPath, string keywordOn, string keywordOff) + { + _shaderPath = shaderPath; + _shader = null; + _keywordOn.Add(keywordOn); + _keywordOff.Add(keywordOff); + } + + /// + /// TShader构造函数。 + /// + /// shader路径。 + /// 开启选项。 + /// 关闭选项。 + public TShader(string shaderPath, string[] keywordOn, string[] keywordOff) + { + _shaderPath = shaderPath; + _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/Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs.meta b/Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs.meta new file mode 100644 index 00000000..72060360 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: afa6558d26134cfcaf35947a15ca1c54 +timeCreated: 1683703243 \ No newline at end of file