2.9 预热Shader

1.预热Shader


1.预热Shader

a.Shader编译就是把人类可读的Shader代码, 翻译成特定GPU能直接执行的机器指令的过程

b.预热Shader就是在使用Shader前提前进行编译
当游戏运行时, 一个物体第一次需要使用某个Shader的特定变体时, 真正的"翻译"才开始; Unity的图形引擎(CPU端)会结合

当前的渲染状态(如灯光开启、雾效开启、是否蒙皮等), 从中间代码中选出需要的部分; 然后, 调用对应平台(如Android的

OpenGL ES、Windows的Direct3D、iOS的Metal)的图形驱动程序;

图形驱动程序扮演了"终极翻译官"的角色, 它将中间代码最终翻译成当前设备GPU的专属机器码; 这个翻译过程非常耗时, 会

阻塞游戏的主线程, 导致游戏卡顿
通过Shader Variant Collection(着色器变体集合)进行着色器预编译

a.在Project窗口右键 → Create → Shader → Shader Variant Collection(着色器变体集合)

b.在Inspector窗口中手动添加想要预热的Shader

c.在脚本中获取到Shader Variant Collection 利用其中的API WarmUp()进行预编译

if( svc!= null && !svc.isWarmedUp )
{
    //对Shader去进行预热(预编译) 可以避免在运行时使用时造成卡顿
    svc.WarmUp();
}: 预热Shader还是需要在合适的时机进行, 比如加载界面时
// 新建空的Shader变体集合
ShaderVariantCollection svc = new ShaderVariantCollection();

// 定义要添加的Shader变体(指定Shader、渲染类型、变体关键字)
ShaderVariantCollection.Entry entry = new ShaderVariantCollection.Entry();

entry.shader = Shader.Find("Standard"); // 目标Shader

entry.passType = PassType.ForwardBase; // 渲染通道

entry.keywords = new string[] { "_NORMALMAP" }; // 变体关键字

// 添加变体到集合
svc.Add(entry);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值