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