当前位置:   article > 正文

关于URP中RendererFeature的使用及毛发效果的几种实现方式_渲染feature

渲染feature

目录

前言

一、铺垫

二、基于程序网格复制的实现

三、基于程序多材质的实现

四、基于RenderObjects手动配置的实现

4.1、多Pass实现多层毛发

4.2、override material实现多层毛发

五、基于RendererFeature代码编写的实现

5.1、创建RendererFeature模板

5.2、先熟悉一下各个方法

5.3、在RenderObjects源码中找它对材质做了什么

5.4、实现RenderObjects的参数面板

5.5、CommandBuffer实现多次绘制

六、资源链接


前言

——发这篇文主要还是想记录一下最近针对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就能搞定的效果还可以通过下面这样的方法来解决。

  1. //第一个Pass
  2. Pass
  3. {
  4. Tags
  5. { "LightMode" = "SRPDefaultUnlit" }
  6. //其他代码
  7. }
  8. //第二个Pass
  9. Pass
  10. {
  11. Tags
  12. { "LightMode" = "UniversalForward" }
  13. //其他代码
  14. }
  15. //第三个Pass
  16. Pass
  17. {
  18. Tags
  19. { "Light
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/233279
推荐阅读
相关标签
  

闽ICP备14008679号