之前我发布过一篇对urp的内置shader lit的结构解析,发现自己说的也不完善,这次直接对源码进行一个解析,并提升一下自己的记忆。

如果你找不到这个shader,那么就有可能你不是urp渲染管线。自己搜索。

在前向渲染pass里面,我们可以看到,urp里面已经不再使用cg语言,而是改用了HLSL渲染语言,其实没大差别,只是里面的一些函数,和一些实现方法出现了变动。
#pragma exclude_renderers gles gles3 glcore 上来你会看到这么一句话,就是后面那几个渲染器不会生成对应渲染器的shader。这里再补一句,我们写的shader不是最终在程序上运行的,因为为了兼容多平台,我们只需要写一套shader,然后unity会根据我们写的shader生成对应平台的运行的shader。

接下来,就是一大堆的宏:


unity会根据你设置的宏,生成相应的shader变体,就相当于一个开关,所以,如果宏过多的话,shader变体会几何倍增,那么占用的内存也会集合倍增。shader的变体其实就是实际运行时的shader,你开关一个宏,它会生成相应的两个shader。如果宏过多,它会生成两套,和其它宏叠加的,你会发现你的shader变体巨多,在哪里看你的变体数量:

你点击后面的show,会打开有宏关键字的变体列表。

这里定义了你的顶点着色器和片元着色器。渲染的时候,渲染引擎会找到相应的shader去运行。

最后,引入了相应的代码,#include就是引入相应的文件代码。
litInput.hlsl 里面主要声明了变量,还有就是初始化pbr使用的表面数据。
LitForwardPass.hlsl 里面就是定义顶点着色器和片元着色器函数和其它运算函数,以及一些获取数据的函数。接下来,我们一个一个的解析。

LitInput.hlsl


开头的这个是为了防止多次引入,所以,设置了一个宏,这个宏只是为了防止多次引用,占用多余内存,不会生成额外变体。

再下面就是引入了多个文件,都是一些内置的。
Core.hlsl 就是unity官方内置的一些函数和宏,方便我们使用。
CommonMaterial.hlsl 定义了一些pbr材质使用的函数
SurfaceInput.hlsl 定义了表面材质通用的属性和函数,比如基础贴图什么的,都在这里面定义的,里面的函数也都是通用的,比如

这个函数,可以让我们求出当前的透明度,以及是否需要裁切。
ParallaxMapping.hlsl 这个是时差偏移的相应函数
DBuffer.hlsl 这个是使用延迟渲染管线用到的函数,我们前向渲染不需要。


这里是如果你使用了细节贴图,将根据宏定义一个新的宏,防止后面判断宏的时候麻烦。

这些就是内置pbr材质所需要的一些属性,为什么要用CBUFFER括起来,是因为为了使用urp的新功能srp合批,srp合批优势在于,我们不再需要保持相同的材质球也能合批,只要使用了相同的shader,就可以实现srp合批。
ps:这里需要提醒一句,如果你要实现srp合批,那么,你的shader里面的pass里面使用的CBUFFER必须保持一致,要不然你shader上面就会提醒你这个:

再往下面看:

这里声明的是对正交相机使用的一些常量,我一般修改的时候,会把这一段删除掉。

这里声明了pbr的一些贴图,urp里面每个贴图需要携带其贴图的采样器,这个采样器就是你在贴图上面设置的贴图拼接模式,

如果你不想使用贴图的,而是想固定住它的采样模式,不管它贴图怎么设置的,我们可以直接写内置的这些采样器的命名:

此截图至:https://blog.csdn.net/lsccsl/article/details/118086659

接下来

这段就是,根据你使用的工作流,来实现不同的SAMPLE_METALLICSPECULAR函数定义,供后面使用,如果你是高光工作流,那么我引擎将去获取高光贴图,如果不是,那么引擎将使用金属度贴图。我们一般都是使用自己定义的工作流,一般还是金属工作流,比如将 ao roughness metallic 设置道一张一张贴图里面。(一般都把粗糙度的使用G通道,意思是G通道的更准确一些,毕竟粗糙度的渐变比较多,ao只是烘焙的环境遮蔽,金属度一般不是0就是1,要求最低)

这个函数,就和上面定义的函数呼应上了,这个函数,主要是通过你设置的数据来求出当前材质的高光光滑度的。你可以打开一个lit材质看一下

我们可以在这里选择相应的工作流,然后选择unity也非常善解人意的让你可以选择你的光滑度是在基础贴图里面,还是在定义的高光颜色贴图a通道里面(高光工作流)或者金属度贴图a通道里面(金属工作流)。然后,我们再看这个函数,就明了了很多,如果你设置了金属高光光滑度贴图,我们将获取金属贴图,然后根据你设置从哪个a通道去获取高光光滑度进行设置。如果没有设置,我们将判断你是哪个工作流,获取高光颜色,然后再根据你的选择生成高光光滑度。


这个就简单了,获取烘焙的AO贴图,用了g通道的值,并且根据你设置的AO强度,和白色进行了插值。

这个是生成涂层的遮罩和涂层光滑度,返回二维向量。如果你没设置贴图,或者没开启涂层,那么将返回默认值,也就意味着没有开启。

这个是获取视差偏移的值,转换到uv偏移上面,时差偏移这里就不讲解实现原理了。

这里是进行缩放细节贴图的基本色。

这个是混合细节贴图基本色和默认的基本色。

这里是细节法向和默认法向的混合。

这里多提一嘴,细节贴图的作用,细节贴图主要是为了展现物体的细节,如果将细节直接烘焙到基本颜色贴图和基本法向贴图上,那么要求基本贴图的精度以及分辨率要高,降低渲染性能,增加内存占用。所以,我们通常会使用额外的细节贴图,来进行重复使用,来实现细节表现,比如放大以后,皮肤的细节。


这个是初始化pbr表面材质所需数据的函数,每个pass渲染中都需要使用。如果你需要Lit的shader自定义,那么需要保留这个函数,就是这个LitInput函数实现是shader里面的多个pass都可以引入的那种。所以,我们需要保证SurfaceData数据的统一

看一下函数内部的运算。

首先实现了基本色和透明度。

然后调用上面的SampleMetallicSpecGloss函数,获取到高光颜色和光滑度。
随后计算出来了最终基本色,就是贴图颜色*基本色颜色。
后面就是根据工作流,设置金属度和高光颜色。高光工作流没有金属度一说,所以设置了1,颜色是从函数里面算出来的颜色。金属工作流,r通道就是金属度,高光颜色直接设置0.
然后下面就是直接从specGloss的a通道获取到光滑度(和粗糙度相反)

然后从贴图上获取到切线空间的法向。

获取烘焙的AO。
如果你设置了自发光,将获取到自发光的颜色。

如果你有涂层,那么我们将计算涂层的遮罩和涂层的光滑度。

如果你设置的细节贴图,那么我们将计算细节相关,并和基本的贴图进行融合。

由于篇幅比较长,这一篇就先解析到这吧。具体实现留到下一篇。

unity urp内置lit材质源码解析(上)相关推荐

  1. unity urp内置lit材质源码解析(中)

    上一篇(https://blog.csdn.net/qq_30100043/article/details/125725934)解析了内置shader lit的主文件和input文件,接下来,我们将视 ...

  2. unity urp内置lit材质源码解析(下)

    接上一篇,这已经是第三篇了,这一篇的难度应该是最高的,因为涉及到pbr的渲染.我作为一个小ta,也不能说能够把物理材质吃透,这里我将能把我理解的都列出来,并结合源码给大家讲解一下. Universal ...

  3. unity URP内置shader lit解析

    unity内置的pbr渲染shader Properties为shader相关属性 两个SubShader里面为相应的渲染内容,第二个为降级处理渲染,如果第一个SubShader不兼容,才会渲染第二个 ...

  4. Python内置函数的源码中方法只有pass占位符说明 Docs

    pass python定义函数,必须有函数体,否则编译就会报错.函数体用一句pass占位是防止报错,并且不会有任何动作.内置函数中使用pass的情况如下: 父类中声明函数,但不声明实现,由继承的子类进 ...

  5. GTA5内置html菜单源码,GTA5免费内置菜单辅助

    ║ ▓▓▓▓▒▒▒▒░░░░| GTA5免费内置菜单辅助 |░░░░▒▒▒▒▓▓▓▓ ║ 首先,几乎所有的内置菜单的快捷键都是,按小键盘*号打开辅助    上8 下2 左4 右6 确定5 返回0(em ...

  6. GTA5内置html菜单源码,【GTA5线上1.46版本免费内置菜单菜单】【5款目前最新可用的内置菜单可供选择】刷钱、套模型、无敌、传送...

    功能上有线上刷钱,给其他玩家套模型 ,无敌 传送等等 首先先回答大家几个关于内置菜单的问题 1.内置菜单会封号嘛? 回答:外置菜单也会有几率封号,我只能说是挂都会有封号的几率,用内置就像抽烟的人对比不 ...

  7. [置顶]Ceph源码解析:PG peering

    转载请注明出处.陈小跑 http://blog.csdn.net/a513029766 集群中的设备异常(异常OSD的添加删除操作),会导致PG的各个副本间出现数据的不一致现象,这时就需要进行数据的恢 ...

  8. Android之EventBus框架源码解析上(单例模式)

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 EventBus能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分 ...

  9. GTA5内置html菜单源码,《GTA5》稀有车收集教程 二十七:全配件载具合集

    本期带大家来获取那些远古版本的稀有车(已绝迹多年,现如今才浮出水面),获取代价极其高昂,囊中羞涩的朋友请量力而行 前期的准备内容: 1.一台培罗 PR4或者欧斯洛 R88(前者更贵一点) 2.足够的现 ...

最新文章

  1. startActivities的使用
  2. Delphi实现截屏功能
  3. golang处理kill命令总结
  4. 软件测试中需求分析谁去做的,软件项目在进入需求分析阶段,测试人员应该开始介入其中。 - 问答库...
  5. 3376: [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
  6. c++创建线程的6种方法
  7. matlab单回路和串级控制回路,单回路和串级控制系统仿真应用研究.doc
  8. 【PCL自学:Feature7】基于转动惯量和偏心量的描述符 (持续更新)
  9. 【捕捉BUG】jupter notebook python缩进报错但又找不到错误 IndentationError: expected an indented block
  10. java如何高效查询重复数据_java – jpa条件查询获取列表中的重复值
  11. 文件外链PHP,php如何去除外链
  12. 认知学习:当代学习理论的主流
  13. 小米洪锋:跟7000万MIUI用户谈谈
  14. 第39级台阶 小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
  15. Visitor(访问者)设计模式
  16. java课题背景,办公自动化系统论文-课题研究的背景和意义及国内外发展状况.doc...
  17. 临淄区青少年科技馆物联云创客项目
  18. oracle请求输出全部都是fndwrr,oracle ebs系统维护技巧汇总
  19. 中国石油大学《计算机文化基础》第一次在线作业
  20. 怎么使用Photoshop软件3D功能设计出炫彩海报

热门文章

  1. Kmp算法之 求最大公共前后缀
  2. 阻抗分析仪 测出的阻抗为负数
  3. 实时流媒体视频监控系统——的流媒体客户端——视频解码处理
  4. 声乐导师:荣永嘉(青年男高音,清畅声乐创始人)
  5. 各种常用计算机视觉库 2
  6. 汽车尾灯自动控制系统
  7. C语言考试知识点汇总(实践知识点)
  8. python第二周基本图形绘制
  9. 微信公众平台网页授权
  10. zTree(二)树状图下拉框