unity urp内置lit材质源码解析(上)
之前我发布过一篇对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材质源码解析(上)相关推荐
- unity urp内置lit材质源码解析(中)
上一篇(https://blog.csdn.net/qq_30100043/article/details/125725934)解析了内置shader lit的主文件和input文件,接下来,我们将视 ...
- unity urp内置lit材质源码解析(下)
接上一篇,这已经是第三篇了,这一篇的难度应该是最高的,因为涉及到pbr的渲染.我作为一个小ta,也不能说能够把物理材质吃透,这里我将能把我理解的都列出来,并结合源码给大家讲解一下. Universal ...
- unity URP内置shader lit解析
unity内置的pbr渲染shader Properties为shader相关属性 两个SubShader里面为相应的渲染内容,第二个为降级处理渲染,如果第一个SubShader不兼容,才会渲染第二个 ...
- Python内置函数的源码中方法只有pass占位符说明 Docs
pass python定义函数,必须有函数体,否则编译就会报错.函数体用一句pass占位是防止报错,并且不会有任何动作.内置函数中使用pass的情况如下: 父类中声明函数,但不声明实现,由继承的子类进 ...
- GTA5内置html菜单源码,GTA5免费内置菜单辅助
║ ▓▓▓▓▒▒▒▒░░░░| GTA5免费内置菜单辅助 |░░░░▒▒▒▒▓▓▓▓ ║ 首先,几乎所有的内置菜单的快捷键都是,按小键盘*号打开辅助 上8 下2 左4 右6 确定5 返回0(em ...
- GTA5内置html菜单源码,【GTA5线上1.46版本免费内置菜单菜单】【5款目前最新可用的内置菜单可供选择】刷钱、套模型、无敌、传送...
功能上有线上刷钱,给其他玩家套模型 ,无敌 传送等等 首先先回答大家几个关于内置菜单的问题 1.内置菜单会封号嘛? 回答:外置菜单也会有几率封号,我只能说是挂都会有封号的几率,用内置就像抽烟的人对比不 ...
- [置顶]Ceph源码解析:PG peering
转载请注明出处.陈小跑 http://blog.csdn.net/a513029766 集群中的设备异常(异常OSD的添加删除操作),会导致PG的各个副本间出现数据的不一致现象,这时就需要进行数据的恢 ...
- Android之EventBus框架源码解析上(单例模式)
转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 EventBus能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分 ...
- GTA5内置html菜单源码,《GTA5》稀有车收集教程 二十七:全配件载具合集
本期带大家来获取那些远古版本的稀有车(已绝迹多年,现如今才浮出水面),获取代价极其高昂,囊中羞涩的朋友请量力而行 前期的准备内容: 1.一台培罗 PR4或者欧斯洛 R88(前者更贵一点) 2.足够的现 ...
最新文章
- startActivities的使用
- Delphi实现截屏功能
- golang处理kill命令总结
- 软件测试中需求分析谁去做的,软件项目在进入需求分析阶段,测试人员应该开始介入其中。 - 问答库...
- 3376: [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
- c++创建线程的6种方法
- matlab单回路和串级控制回路,单回路和串级控制系统仿真应用研究.doc
- 【PCL自学:Feature7】基于转动惯量和偏心量的描述符 (持续更新)
- 【捕捉BUG】jupter notebook python缩进报错但又找不到错误 IndentationError: expected an indented block
- java如何高效查询重复数据_java – jpa条件查询获取列表中的重复值
- 文件外链PHP,php如何去除外链
- 认知学习:当代学习理论的主流
- 小米洪锋:跟7000万MIUI用户谈谈
- 第39级台阶 小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
- Visitor(访问者)设计模式
- java课题背景,办公自动化系统论文-课题研究的背景和意义及国内外发展状况.doc...
- 临淄区青少年科技馆物联云创客项目
- oracle请求输出全部都是fndwrr,oracle ebs系统维护技巧汇总
- 中国石油大学《计算机文化基础》第一次在线作业
- 怎么使用Photoshop软件3D功能设计出炫彩海报