找回密码
 立即注册
查看: 720|回复: 0

[笔记] 深入改造Unity URP PBR(一)

[复制链接]
发表于 2020-12-31 12:24 | 显示全部楼层 |阅读模式
这大概是畅游unity两周做的一些小东西。unity在之前的LWRP的基础上把LWRP升级成为了URP,我觉得unity在设计渲染管线这儿更加灵活,对于开发人员来说
定制化会比虚幻简单很多。但是URP因为是才推出的东西所以坑也不少,相信unity后面会慢慢完善这些东西。首先来看看URP渲染管线的一些目录结构。来看下最终的效果




如果只是修改PBR和自定义自己的光照模型等,我们只需要关注Shader的一些核心文件。首先是Shaders这个目录




这个目录存放了各种Pass的文件,比如unity就分成了Lit Pass和Unlit Pass来区分受光照和不受光照两种类型的Shader,这里的Shader一般都会include写好的HLSL Pass。其次就是Shader Library这个文件夹下的这些文件




这些文件基本上是和PBR光照算法关联的核心文件。
这些目录了解过后,接下来就是看下关键的一些核心文件的代码。首先是Lighting文件,这是整个PBR的核心文件,所有PBR的核心接口和函数都包含在这里面。首先是




这个结构体包含了BRDF计算的核心参数,这个后面我们是需要做拓展的,因为后面我们会增加各向异性的shadingmodel,布料,3S各种各样的shadingmodel。




这个结构体主要是光照的一些参数,因为这里只是动PBR所以这个结构体我们不会关心。




接下来就是初始化BRDF结构体的函数,这个函数我们可以看到定义了各种各样宏去走分支,这个和虚幻差不多。我们也会重点这个函数,因为我们一旦扩展了BRDF这个结构体,这里面初始化的东西也得扩展。




这个函数我重新封装过,所以和Unity自带的不太一样,但是这个就是BRDF fr和fd这两项的计算结果,所以这个就是整个PBR 光照计算的最为核心的部分,下面会讲如何具体封装这个函数。




这个函数是球谐函数,主要用于间接光照的计算,unity URP的IBL这套东西做的还不错,之前做了一套IBL最后的效果和unity差不多,所以这里就不修改了。




这个函数调用了之前的BRDF的核心函数,并把BRDF需要的参数传递过来。




这个函数才是最后总的参数,这里第一个参数是InputData,这个结构体相当关键,这里才是我们的HLSL文件和Shader文件关联的一个结构。那么这个InputData是哪儿的呢。这个结构体在




这个文件中,当然这里只是它的声明。




他所有的参数如何传递是写在LitFowardPass.hlsl这个文件中。




打开LitFowardPass这个文件




我们看到这里进行了参数传递,用surfacedata这个结构体中的值传给了inputdata这个结构体中。OK继续往上找,看看surfacedata如何get到的这些值。
在Surfaceinput这个文件中声明了这个结构体,但是没有具体的参数传递




它真正的传递是在LitInput.hlsl这个文件中










这里用一个CBUFFER将Shader的变量传递,而且通过Shader定义的宏,去走各种各样的分支。这里基本上就完成了从上层到下层传递。
这里总结一下,BRDFdata这个结构体中的值来自己与InputData这个结构体中,而SurfaceData这个结构体主要负责接收Shader层传递下来的数据,所以InputData是个桥梁,连接了BRDFdata和SurfaceData这两个参数之间的传递,所以在Shader中我们需要调节粗糙度,金属这些参数时才会有效果变化。
这些理解过后,我们开始封装自己的BRDF函数,第一步需要将




Cache文件下的URP移到




这个文件夹中,这样打开读写保护。不然无法在URP文件夹下添加文件。这里我新创建了一个BRDFFunction的HLSL文件,这个文件里面包含了各种各样ShadingModel BRDF的计算公式函数




当然你可以用Unity自带的




在CoreRP这个包里面,unity自己也写了各种各样的BRDF的函数。接下来我创建了一个叫StandSurface的文件,这个文件主要用于PBR总函数Fr和Fd最后的计算结果,因为BRDF这些函数里面只写了DFG这些的计算公式,所以还需要封装一层,来完成各种各样的shadingModel




这里基本上就完成了我们第一步了。
接下来就是调用这个里面的函数。我们的思路是每个ShadingModel都应该具有独立的BRDFData这个结构体,因为比如各向异性需要切线空间,就会具有不用的参数结构。所以把Lighting.hlsl这个文件复制一份,改成自己想要的一个名字。
因为现在我们这个ShadingModel我只是想对比下UE4的BRDF和Unity的不同,所以现在BRDFData这个参数不需要任何修改,就是我们想要的参数。




直接在DirectBRDF中调用我们写好的BRDF函数就可以了,当然头文件需要自己include一下。这里会比较简单,因为不需要去修改任何的参数传递。
接下来我们在LitFowradPass.hlsl这个文件中




像这样去定义一个宏,然后包含我们写好的这个头文件。最后在Shader中去定义这些宏。




下一篇会添加自己的shadingmodel,并对比UE4和Unity的BRDF不同。
提取码:cpp6

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-23 12:20 , Processed in 0.096443 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表