From 9c110e23a6de6f711ee6a036620d7e389c05b81d Mon Sep 17 00:00:00 2001
From: ALEXTANG <574809918@qq.com>
Date: Wed, 10 May 2023 15:45:40 +0800
Subject: [PATCH] [+] TShader & ActorShaderMgr
[+] TShader & ActorShaderMgr
---
.../TEngine/Runtime/GameFramework/Shader.meta | 8 +
.../GameFramework/Shader/ActorShaderGroup.cs | 41 +++++
.../Shader/ActorShaderGroup.cs.meta | 3 +
.../GameFramework/Shader/ActorShaderMgr.cs | 64 ++++++++
.../Shader/ActorShaderMgr.cs.meta | 3 +
.../GameFramework/Shader/ActorShaderType.cs | 48 ++++++
.../Shader/ActorShaderType.cs.meta | 3 +
.../Runtime/GameFramework/Shader/TShader.cs | 145 ++++++++++++++++++
.../GameFramework/Shader/TShader.cs.meta | 3 +
9 files changed, 318 insertions(+)
create mode 100644 Assets/TEngine/Runtime/GameFramework/Shader.meta
create mode 100644 Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderGroup.cs
create mode 100644 Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderGroup.cs.meta
create mode 100644 Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderMgr.cs
create mode 100644 Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderMgr.cs.meta
create mode 100644 Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderType.cs
create mode 100644 Assets/TEngine/Runtime/GameFramework/Shader/ActorShaderType.cs.meta
create mode 100644 Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs
create mode 100644 Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs.meta
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