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