什么大师特 发表于 2021-1-7 09:36

Unreal-TrickTech_Unlit LightingSystem

    在UE里面开发Shading内容是一件极其痛苦的事情,对于Global类型的Shader还可以用recompileRender XXXXX来做到快速迭代。对于Surface这种Shader就得手动去改ShadingModel每次改完编译得去单独打开某一个材质去Apply做单一更新,但是有时候测试Shading效果往往不止一个材质有效果这时候每个打开去Apply很不现实。于是乎为了在UE里面做到快速迭代的Shading开发以及为了后续的一些TrickShading(比如以后会分享的海洋渲染如何做到多光源和本地光源),我们就自己造一套Unlit LightingSystem吧。
    首先用Unlit去做Lighting最Bug的就是只能单一Vector4的Parameter去做LightDir(商城貌似有手动传64个Parameter来做的),为了比较方便解决这一问题这里使用了以前各位聚聚分享过的用RT来伪造StructBuffer的方法。参考如下。
首先呢我们做一个结构体来作为灯光的StructData,然后申请两个RT ARGB来存储float4(LightColor, LightIntensity)和float4(LightPos, LightRange)。然后我们就可以收集场景里面的灯光的数据并将它们写入RT数据最后传给材质里面边可以很方便的做后续使用了。最后在构造函数里面以及Tick函数里面做做OmParameterUpdate和PreFrameUpdate,这里TickUpdate做了更新频率控制的选项。
灯光的数据结构
清除Buffer和收集数据
把收集的数据写入RT,这里没做啥合并优化所以就直接分了两次来实现两个float4的写入
每帧更新
参数更新
    另外这里编码模式并没有采样那种正方形的二维排布,因为发现好像不需要那种形式还不好遍历。最后直接用了一维的当然我自己给了个最高限制32个,根据需求可以自己调。然后就是Shader部分,限制四个数据都有了在材质里面靠Custom编码的特性可以做到写自定义函数,这里刚做到基础的读取就简单上了个色。对于Shading的封装这里是靠下面文章的开头的内容来封的所以PBR NPR都适合。
一维编码
BSDF的封装
简单的Lighting
    至于阴影,本来以前4.20之前是可以用LightAttentionTexture的但是不知道给改到哪儿去了知道的聚聚求告知。所以我就用了距离场来手算了一个。方法可以直接参考IQ的博客然后材质里面可以直接拿到距离场的NearSetSurfaceData,然后自己做一下jitter即可,效果如下。
页: [1]
查看完整版本: Unreal-TrickTech_Unlit LightingSystem