mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-07 16:45:10 +00:00
统一封装对shader的管理和示例。
统一封装对shader的管理和示例。
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 123e7155051957847883c574bf957c7f
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -0,0 +1,49 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace TEngine
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 封装一个角色可能用到的各种shader场景。
|
||||||
|
/// </summary>
|
||||||
|
class ActorShaderGroup
|
||||||
|
{
|
||||||
|
private readonly TShader[] _allShader = new TShader[(int)ActorShaderEnvType.EnvTypeMax];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 增加Shader到角色Shader分组。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="shaderType">当前环境类型。</param>
|
||||||
|
/// <param name="shader">TShader。</param>
|
||||||
|
public void AddShader(ActorShaderEnvType shaderType, TShader shader)
|
||||||
|
{
|
||||||
|
_allShader[(int)shaderType] = shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据当前环境获取Shader。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">当前环境类型。</param>
|
||||||
|
/// <returns>TShader。</returns>
|
||||||
|
public TShader GetShader(ActorShaderEnvType type)
|
||||||
|
{
|
||||||
|
return _allShader[(int)type];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断是否符合shader集合。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="shader">Shader实例。</param>
|
||||||
|
/// <returns>是否符合。</returns>
|
||||||
|
public bool IsMatch(Shader shader)
|
||||||
|
{
|
||||||
|
foreach (var dodShader in _allShader)
|
||||||
|
{
|
||||||
|
if (dodShader != null && dodShader.Shader == shader)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 79b6e5be73e14c929b6a3b4a980976ac
|
||||||
|
timeCreated: 1701916950
|
@@ -0,0 +1,117 @@
|
|||||||
|
using GameBase;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace TEngine
|
||||||
|
{
|
||||||
|
enum ActorShaderGroupType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 通用的角色shader
|
||||||
|
/// </summary>
|
||||||
|
Brdf = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 眼睛
|
||||||
|
/// </summary>
|
||||||
|
BrdfEye,
|
||||||
|
|
||||||
|
///可能后面扩展,比如特效的特殊角色材质
|
||||||
|
GroupMax,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ActorShaderEnvType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 游戏内场景默认模型,不带阴影,不带xray,不透明效果
|
||||||
|
/// </summary>
|
||||||
|
EnvNormal = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 展示场景
|
||||||
|
/// </summary>
|
||||||
|
EnvShow,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 带阴影
|
||||||
|
/// </summary>
|
||||||
|
EnvShadow,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 带xray,默认也带Shadow
|
||||||
|
/// </summary>
|
||||||
|
EnvXRay,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 透明渐隐效果
|
||||||
|
/// </summary>
|
||||||
|
EnvAlphaFade,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 展示场景没shadow
|
||||||
|
/// </summary>
|
||||||
|
EnvShow_NoShadow,
|
||||||
|
|
||||||
|
EnvTypeMax
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 角色Shader管理器。
|
||||||
|
/// </summary>
|
||||||
|
class ActorShaderMgr : Singleton<ActorShaderMgr>
|
||||||
|
{
|
||||||
|
private readonly ActorShaderGroup[] _allShaderGroup = new ActorShaderGroup[(int)ActorShaderGroupType.GroupMax];
|
||||||
|
|
||||||
|
public ActorShaderMgr()
|
||||||
|
{
|
||||||
|
CreateBrdfShader();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据当前Render查找角色的Shader分组。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="render">Render。</param>
|
||||||
|
/// <returns>角色的Shader分组。</returns>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5a38b9b4bee84fabb1ef8db5292a6db6
|
||||||
|
timeCreated: 1701916853
|
@@ -0,0 +1,154 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace TEngine
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// TShader scripts used for all rendering.
|
||||||
|
/// <remarks>统一封装对shader的管理。</remarks>
|
||||||
|
/// </summary>
|
||||||
|
public class TShader
|
||||||
|
{
|
||||||
|
private bool _loaded;
|
||||||
|
private Shader _shader;
|
||||||
|
private readonly string _shaderName;
|
||||||
|
private readonly string _shaderLocation;
|
||||||
|
private readonly List<string> _keywordOn = new List<string>();
|
||||||
|
private readonly List<string> _keywordOff = new List<string>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Shader scripts used for all rendering.
|
||||||
|
/// </summary>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找Shader。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="shaderLocation">Shader定位地址。</param>
|
||||||
|
/// <param name="shaderName">Shader名称。</param>
|
||||||
|
/// <returns>Shader实例。</returns>
|
||||||
|
public static Shader FindShader(string shaderLocation,string shaderName)
|
||||||
|
{
|
||||||
|
Shader shader = GameModule.Resource.LoadAsset<Shader>(shaderLocation);
|
||||||
|
if (shader != null)
|
||||||
|
{
|
||||||
|
return shader;
|
||||||
|
}
|
||||||
|
return Shader.Find(shaderName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// TShader构造函数。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="shaderName">shader名称。</param>
|
||||||
|
/// <param name="shaderLocation">shader路径。</param>
|
||||||
|
public TShader(string shaderName, string shaderLocation)
|
||||||
|
{
|
||||||
|
_shaderName = shaderName;
|
||||||
|
_shaderLocation = shaderLocation;
|
||||||
|
_shader = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// TShader构造函数。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="shaderName">shader名称。</param>
|
||||||
|
/// <param name="shaderLocation">shader路径。</param>
|
||||||
|
/// <param name="keywordOn">开启选项。</param>
|
||||||
|
/// <param name="keywordOff">关闭选项。</param>
|
||||||
|
public TShader(string shaderName, string shaderLocation, string keywordOn, string keywordOff)
|
||||||
|
{
|
||||||
|
_shaderName = shaderName;
|
||||||
|
_shaderLocation = shaderLocation;
|
||||||
|
_shader = null;
|
||||||
|
_keywordOn.Add(keywordOn);
|
||||||
|
_keywordOff.Add(keywordOff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// TShader构造函数。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="shaderName">shader名称。</param>
|
||||||
|
/// <param name="shaderLocation">shader路径。</param>
|
||||||
|
/// <param name="keywordOn">开启选项。</param>
|
||||||
|
/// <param name="keywordOff">关闭选项。</param>
|
||||||
|
public TShader(string shaderName, string shaderLocation, string[] keywordOn, string[] keywordOff)
|
||||||
|
{
|
||||||
|
_shaderName = shaderName;
|
||||||
|
_shaderLocation = shaderLocation;
|
||||||
|
_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: e219233984c14f7d97bc744c07fe13d0
|
||||||
|
timeCreated: 1698115491
|
Reference in New Issue
Block a user