赞
踩
目录
5.3、在RenderObjects源码中找它对材质做了什么
——发这篇文主要还是想记录一下最近针对URP中RendererFeature的初步学习。因为网上搜的各种资料个人感觉对我这种水平的都太不友好了- -所以也算是写一篇自己看得懂的教程来给自己看,相信也适合刚玩U3D shader没多久的萌新_(:з)∠)_
——RendererFeature这玩意也算是个人小两年前刚接触shader时的一个历史遗留问题了,当时因为对U3D和程序的理解都不够所以搜了些资料也看不懂就搁置了···因为最近遇到一个需要做毛发效果的带蒙皮动画的模型,用之前那种网格复制的方式乍得一想解决不了动画的问题(其实传个权重就能简单解决- -···一会讲),所以下决心攻坚一波。
——经过国内外查了一大堆文章和视频资料,同时自己又去硬着头皮啃了啃U3D内置功能的源码试了又试,现在初级的RendererFeature的代码编写已经能实现了(放在最后讲)。但对其中很多像是CommandBuffer之类的功能模块的理解还很浅显,所以也希望专业的带佬能在评论区分享一下干货_(:з)∠)_
——然后说一下项目环境和版本。示例用的是unity 2020.3.36f1c1,URP 10.9(URP版本可在项目内上方window->package manage里看)。因为URP的频繁更新,所以一些内置功能和函数不太稳定,(比如renderfeature里要用到的ScriptableRenderPass类的OnCameraSetup方法在URP11里就变成了Configure)所以文章最后放的资源如果有报错可能是因为版本问题。
——像上图这种密度较高但又需要做体积的效果,如果用的是U3D的内置管线而非URP,那么一种常见的套路是在SubShader里写多个pass。(shader没啥技术含量就不贴了- -网上类似的更好的一大堆,也可以直接到后面的资源里去找本文用的)
——每个pass的代码几乎完全相同,主要不同在于在顶点阶段需要根据当前层数来计算法线方向的顶点偏移量,这样便形成了同一个模型渲染了多层的效果。当层与层之间的间隔足够小时,离远了看上去就会像是一个有体积的突起(微积分的思想···另一种常见的描边效果也可以这么做,只不过只外扩了一层并剔除了正面)。但也因此,层数低或离得近时就会出现上图右侧明显的分层现象。
——问题在于,URP的shader本身不支持十几甚至几十个这么多pass的写法,即便写了实际也不会运行。如果像是描边这种两个pass就能搞定的效果还可以通过下面这样的方法来解决。
- //第一个Pass
- Pass
- {
- Tags
- { "LightMode" = "SRPDefaultUnlit" }
- //其他代码
- }
-
- //第二个Pass
- Pass
- {
- Tags
- { "LightMode" = "UniversalForward" }
- //其他代码
- }
-
- //第三个Pass
- Pass
- {
- Tags
- { "Light

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。