[+] TShader & ActorShaderMgr

[+] TShader & ActorShaderMgr
This commit is contained in:
ALEXTANG
2023-05-10 15:45:40 +08:00
parent 1ee6dc2611
commit 9c110e23a6
9 changed files with 318 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c626b7c1efe3edc428b44fbd255fb8fc
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,41 @@
using UnityEngine;
namespace TEngine
{
/// <summary>
/// 封装一个角色可能用到的各种shader场景
/// </summary>
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];
}
/// <summary>
/// 判断是否符合shader集合。
/// </summary>
/// <param name="shader"></param>
/// <returns></returns>
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;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d86565c5f68a47bcae345c0ba306934e
timeCreated: 1683704019

View File

@@ -0,0 +1,64 @@
using UnityEngine;
namespace TEngine
{
/// <summary>
/// 统一管理ActorShader。
/// </summary>
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;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 87ab4c41cc4745358e6e0f91ddd4c1db
timeCreated: 1683704043

View File

@@ -0,0 +1,48 @@
namespace TEngine
{
enum ActorShaderEnvType
{
/// <summary>
/// 游戏内场景默认模型。
/// </summary>
EnvNormal = 0,
/// <summary>。
/// 展示场景。
/// </summary>
EnvShow,
/// <summary>
/// 带阴影。
/// </summary>
EnvShadow,
/// <summary>
/// 带xray默认也带Shadow。
/// </summary>
EnvXRay,
/// <summary>
/// 透明渐隐效果。
/// </summary>
EnvAlphaFade,
EnvTypeMax
}
enum ActorShaderGroupType
{
/// <summary>
/// 通用的角色shader。
/// </summary>
Normal = 0,
/// <summary>
/// 眼睛。
/// </summary>
NormalEye,
///可能后面扩展,比如特效的特殊角色材质。
GroupMax,
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0b452c6b71ee47609c6530b6d8c8c8e1
timeCreated: 1683703983

View File

@@ -0,0 +1,145 @@
using System.Collections.Generic;
using UnityEngine;
namespace TEngine
{
/// <summary>
/// TShader scripts used for all rendering.
/// </summary>
class TShader
{
private bool _loaded;
private Shader _shader;
private readonly string _shaderPath;
private readonly List<string> _keywordOn = new();
private readonly List<string> _keywordOff = new();
/// <summary>
/// Shader scripts used for all rendering.
/// </summary>
public Shader Shader
{
get
{
if (!_loaded)
{
_loaded = true;
_shader = FindShader(_shaderPath);
if (_shader == null)
{
Debug.LogErrorFormat("invalid shader path: {0}", _shaderPath);
}
}
return _shader;
}
}
/// <summary>
/// 查找Shader。
/// </summary>
/// <param name="shaderName">Shader名字。</param>
/// <returns>Shader实例。</returns>
public static Shader FindShader(string shaderName)
{
Shader shader = GameModule.Resource.LoadAsset<Shader>(shaderName);
if (shader != null)
{
return shader;
}
return Shader.Find(shaderName);
}
/// <summary>
/// TShader构造函数。
/// </summary>
/// <param name="shaderPath">shader路径。</param>
public TShader(string shaderPath)
{
_shaderPath = shaderPath;
_shader = null;
}
/// <summary>
/// TShader构造函数。
/// </summary>
/// <param name="shaderPath">shader路径。</param>
/// <param name="keywordOn">开启选项。</param>
/// <param name="keywordOff">关闭选项。</param>
public TShader(string shaderPath, string keywordOn, string keywordOff)
{
_shaderPath = shaderPath;
_shader = null;
_keywordOn.Add(keywordOn);
_keywordOff.Add(keywordOff);
}
/// <summary>
/// TShader构造函数。
/// </summary>
/// <param name="shaderPath">shader路径。</param>
/// <param name="keywordOn">开启选项。</param>
/// <param name="keywordOff">关闭选项。</param>
public TShader(string shaderPath, string[] keywordOn, string[] keywordOff)
{
_shaderPath = shaderPath;
_shader = null;
_keywordOn.AddRange(keywordOn);
_keywordOff.AddRange(keywordOff);
}
/// <summary>
/// 设置Shader效果。
/// </summary>
/// <param name="render"></param>
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);
}
}
}
/// <summary>
/// 清除shader。
/// </summary>
/// <param name="render"></param>
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]);
}
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: afa6558d26134cfcaf35947a15ca1c54
timeCreated: 1683703243