上一篇(https://blog.csdn.net/qq_30100043/article/details/125725934)解析了内置shader lit的主文件和input文件,接下来,我们将视线关注到LitForwardPass.hlsl。
这个文件内主要是shader的渲染逻辑,里面包含了顶点着色器和片元着色器。

在pass里面,我们可以看到顶点着色器和片元着色器的函数名称,所以,我们在LitForwardPass.hlsl里面直接先去寻找这两个函数。

我们查看整个文件,可以发现,这个文件结构很简单,上面就是引入了Lighting.hlsl文件,里面包含了光照相关的函数和实现。
下面就是根据你材质上设置的宏,另外开启了方便做判断的宏。
下面Attributes和Varyings分别是顶点着色器和片元着色器使用的缓冲区结构体。
再往下就是shader中pass指定的顶点着色器和片元着色器。

顶点着色器

按照渲染的顺序,在cpu中,进行剔除和排序后,cpu会调用drawcall进行绘制,首先调用的就是顶点着色器,那么我们先从顶点着色器的逻辑开始解析。
顶点着色器需要传入顶点相关的数据,我们可以自己定义需要传入的内容,内置的结构体为

根据结构内的名字我们不难看出,分别是
顶点位置
顶点法向
顶点切线(和顶点法向垂直的,并且是根据UV的方向生成的切线方向)
顶点的UV
顶点的静态光照UV
顶点的动态光照UV
实现unity得instance合批定义的关键字


顶点着色器需要返回一个Varyings类型的数据,所以在顶点着色器中,先声明了一个需要返回的变量。

结构体里面有大量的宏判断,就是在不同的变体中,它的Varyings的结构内的数据也会不同,而顶点着色器也是生成Varyings相关数据的函数,所以,这两个我们放到一起进行解析。

首先这里,其实就是根据你的传入input生成instance的id,这样就可以生成相关数据,前两个是生成instance的相关数据,最后一个是兼容VR。对应的就是Varyings的最后两个配置项。而且你需要使用,也需要在片元着色器里面进行设置。

这是在片元着色器的代码。如果你要实现instance,按照unity写法实现即可。VR兼容可以按需设置。

接着看顶点着色器

这两句第一个返回了顶点所需的数据

查看结构体,我们可以看到,返回的值是根据传入的位置,给你计算出世界空间 视线空间 裁剪空间 以及NDC空间(归一化的设备坐标)的位置。
第二个函数,主要计算出当前顶点的副法线,我们可以看到这个结构体内的值

计算出这两个结构体内的值,供后面使用。


这一句就有点意思,这个主要是计算除主光源后的附加光源的,如果你设置的是使用顶点去计算附加光源,这个返回的vertexLight是有颜色的,如果你在片元里面去计算,那么精细度更高,但顶点里面计算更节省渲染性能。在顶点里面计算,一般都是超过了我们设置的光照个数以后,还有光照,那么,它不会不渲染,而是在顶点里面做一个简单的渲染,只是精度会低很多,因为它是逐顶点计算的。


这个就是求出雾的强度,使用unity内置的函数,我们也可以在光照那设置雾的参数。


这个是直接根据基础贴图的TIllingOffset计算出实际在片元着色器中使用的UV。

这句就是设置世界空间的法向。

这段主要是返回的世界空间坐标系下的切线法向,只有在你使用了法向贴图或者需要使用视差偏移时才会传出。所以我们在Varyings里面也看到了有相应的宏的判断。sign是设备兼容,有的渲染器切线方向是需要设置相反的方向。


这一段是,如果你需要使用视差偏移,那么,将计算出世界空间下的视线方向,并根据此计算出在切线空间的视角朝向。


这一句是使用了内置的函数,计算出了当前的使用烘焙光照贴图上的uv,如果你开始了光照贴图的宏的话。
如果你开启了动态光照烘焙,那么将给片元传输动态光照烘焙的UV

这里是计算球谐光照的顶点颜色

如果你有顶点光照颜色,那么将顶点光照和雾的强度一块传出,不然只传出雾的强度。

如果你开启了阴影,那么将计算出顶点的shadowMap上的UV。

这个是设置裁剪空间的位置。在这里多说一句

我们能看到在Varyings结构体中,这个后缀是SV_POSITION,代表着这个值是代表模型顶点位置在颜色缓冲区上面的位置,也是必须的。

片元着色器

接下来我们看一下片元着色器

片元着色器需要将我们顶点着色器生成的数据传入,并最终返回一个四维的向量,代表着这个片元绘制到缓冲区的像素颜色以及透明度。

开头还是需要设置instance和vr兼容函数,这个是必须放在最前面的。

这里还是对视差映射进行处理,如果没有在顶点着色器里计算切线空间的相机朝向,这里再计算。然后通过相机朝向,对贴图的uv进行偏移。

这个就是litshader在LitInput.hlsl定以的生成一些材质属性,什么金属度 基本色 光滑度什么的,具体的内容可以查看源码解析(上)。

这个函数其实是根据传入的Varyings数据,以及切线空间的法向,求出渲染PBR所需的数据。

InitializeInputData

那么我们现在解析一下InitializeInputData函数里面进行了哪些数据的生成,我们可以先看一下返回的数据的结构体

上面可以看到还有个宏,开启debug以后,会传出更多的内容,那么,我们看一下,InitializeInputData到底如何生成相关数据的。

先初始化一下变量

设置世界空间位置

获取到相机朝向顶点位置的方向,世界空间下,并且进行了归一化。

如果使用了法向贴图或者细节贴图,将生成世界空间的法向和切线,没有的话,只生成世界空间的法线。

生成阴影贴图的UV

根据你在unity设置的雾的配置,生成实际上的雾的强度。如果有顶点计算的多光源颜色,那么也将生成顶点光的值。

获取全局烘焙光照颜色。

获取到屏幕空间的UV

获取阴影遮罩

这里是debug使用。

接着回到片元着色器


这个是debug的函数,好像是新加的,如果写正式项目,我们可以去掉。根据名称可以看出,这个是设置调试用的贴图。

这是延迟渲染管线所需的,如果是延迟渲染管线,将修改inputData内的一些数据。

这个就是重点内容了,我感觉需要单开一篇来讲解这里面的内容。里面主要实现pbr的渲染,使用了我们之前生成的数据,我们去源码解析(下)去再去解析。这个返回了pbr计算出来的颜色。

这里就是颜色根据雾的强度进行一个混合,模拟雾的效果。

计算颜色的透明度。

到此最后返回颜色,完成了片元着色器,对最终写入颜色缓冲区颜色的计算。

具体lit内置的pbr如何实现,我再写一篇讲解。

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

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

    之前我发布过一篇对urp的内置shader lit的结构解析,发现自己说的也不完善,这次直接对源码进行一个解析,并提升一下自己的记忆. 如果你找不到这个shader,那么就有可能你不是urp渲染管线. ...

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

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

  3. 源码解析中看到的奇淫巧技

    源码解析中看到的奇淫巧技 一. 数组重置 let arr = [123,123] arr.length // 2 arr.length = 0 arr // [] 当我们给数组的length 属性设置 ...

  4. unity URP内置shader lit解析

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. springcloud(四):熔断器Hystrix
  2. 使用 typescript ,提升 vue 项目的开发体验(1)
  3. 仿豆丁百度文库网页版阅读器完整解决方案
  4. android px,dp,sp大小转换工具
  5. c语言字符串匹配函数index,C语言(函数)学习之index、rindex
  6. Windows 10下 jupyter notebook 安装,打开,使用,关闭方法
  7. prometheus命令_Prometheus
  8. 下载频道12月热门资源TOP100强力推荐!
  9. Sublime Text3的Package Control安装教程,及报错解决There Are No Packages Available For Installation...
  10. python aes加密对于长字符数据丢失_Python 3中AES加密和解密的字符串字节数
  11. java中JFrame.setSize,Java JFrame .setSize(x, y) not working?
  12. 中望3d快捷键命令大全_中望CAD常用快捷键集合
  13. subst ( 将任意目录挂载成虚拟磁碟机 )
  14. netty 之 异步处理双子星io.netty.util.concurrent.Future与io.netty.util.concurrent.Promise
  15. OSS上传txt文件乱码问题
  16. 如何查看电脑有几个内存条插槽
  17. 空间点到直线距离的一种解法
  18. 全面讲解Web3.0域名的应用场景-赛道情况-未来挑战
  19. 关于毕业设计的一些小总结
  20. Js 在字符串中提取数字

热门文章

  1. Pandas读取Excel中的股票代码时,补全前面0的办法
  2. 我所学到的EC-1(个人学习总结,不能保证正确,欢迎大佬指正)
  3. 7-6 判断题 (15分)
  4. 【vivado UG学习】Synthesis策略学习
  5. 打包软件一键安装_InstallShield2015PremierComp打包软件安装步骤
  6. ROS(ERROR):Rosdep cannot find all required resources to answer your query
  7. python实训报告50000_Python实训周总结
  8. BloomFilter--理解总结
  9. 安卓版微信数据库导出
  10. 蝶梦,五种架构演变史