mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-07 16:45:10 +00:00
[+] TShader & ActorShaderMgr
[+] TShader & ActorShaderMgr
This commit is contained in:
8
Assets/TEngine/Runtime/GameFramework/Shader.meta
Normal file
8
Assets/TEngine/Runtime/GameFramework/Shader.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c626b7c1efe3edc428b44fbd255fb8fc
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d86565c5f68a47bcae345c0ba306934e
|
||||
timeCreated: 1683704019
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 87ab4c41cc4745358e6e0f91ddd4c1db
|
||||
timeCreated: 1683704043
|
@@ -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,
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0b452c6b71ee47609c6530b6d8c8c8e1
|
||||
timeCreated: 1683703983
|
145
Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs
Normal file
145
Assets/TEngine/Runtime/GameFramework/Shader/TShader.cs
Normal 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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: afa6558d26134cfcaf35947a15ca1c54
|
||||
timeCreated: 1683703243
|
Reference in New Issue
Block a user