因为这块Unity就是完爆UE,看了一堆回答是真看不下去。要是说比资源加载,比多线程,比内置管线,你骂Unity,那我绝对跟你一起骂,甚至长篇大论的骂(最近刚骂完),但是要是有事没事往渲染管线上开团,这个可就得理论理论了。
在渲染管线这方面,Scriptable Rendering Pipeline在设计思想上秒杀UE的老管线50条街,以至于上层脚本开发者连源码都不需要就能让渲染效率秒掉UE,而UE还在一边Compiling。就拿不透明物体的渲染阶段说一下,截止到本人目前电脑上使用的UE4.23,GBuffer的分布:
Memo of GBuffer
GBufferA : Normal(rgb), PerObjectGBufferData(a)
GBufferB : Metallic(r), Specular(g), Roughness(b), ShadingModelID(a&0xF),
SelectiveOutputMask(a&0xF0)
GBufferC : BaseColor(rgb), IndirectIrradiance(a)
GBufferD : CustomData(rgba)
GBufferE : PrecomputedShadowFactors(rgba)
SceneDepth
CustomNativeDepth : depth
CustomStencilTexture
GBufferVelocity : rg(16 bit)
Emissive: rgba (hdr)
Dbuffer
DBufferA : PreMultColor(rgb), ColorOpacity(a)
DBufferB : PreMulWorldNormal(rgb), NormalOpacity(a)
DBufferC : PreMulRoughness(r ), RoughnessOpacity(g)
这么一堆东西,加入没有特殊需求,不使用Custom GBuffer,就纯粹的做写实画风渲染,带宽消耗大致为:
GBufferA(4 byte)
GBufferB(4 byte)
GBufferC(4 byte)
GBufferE(4 byte)
SceneDepth(4 byte)
GBuffer Velocity(4 byte)
Emissive (8 byte)
DBufferA: (4 byte)
DBufferB: (4 byte)
DBufferC: (2 byte)
这一套下来,每个像素的带宽占用是:42 bytes
我们尝试用SRP优化成Tile Base/Cluster Base Forward+管线,同时还要保证UE现有的保证效果的后处理(如AO,SSR,SSGI等)必须用到的GBuffer信息,那么以上的信息有这些可以缩减:
GBufferB.a: 直接光的着色发生在Base pass中,不需要输出材质信息
GBufferC.a:同上
GBufferE: 同上
DBufferABC: 通过Cluster Culling或Tile Culling,将Decal信息提前输出到屏幕位置,在Base pass完成计算,不需要输出。
其他部分是后期管线必需的信息,不可省略,各自少一个通道的GBufferB和GBufferC可以组成一个4通道和一个2通道的RT。
这样,就可以在带宽占用上,让每个像素少了16 bytes,如果渲染规格是2560 * 1440分辨率,如果目标渲染帧数是60FPS,那么每秒带宽将会节约:3.296G,目标渲染帧数是144FPS,那么每秒带宽将会节约:7.910G,大家可以对比一下自己显卡的IO数据,感受一下这个提升是多么显著。
免喷声明:
虽然Unreal Engine官方团队一直在积极开源并解决用户的问题,关于这些管线的问题本人也和Unreal官方的大佬友好交流过,但是遗憾的是似乎国内开源(tuan)社区的风气并没有那么好,各种饭圈操作频出,起码本人经常受到一些无端而可笑的攻击,这里直接把几个经常遇到的提问给答了:
问:你说的这么轻巧,有用SRP写过这套实现吗?
答:有,在专栏里。
问:这套方案是你脑补的还是有项目验证的?
答:可以关注历年Siggraph和GDC的分享,感觉大厂讲解人为了宣传嘴皮子都磨破了。既然有分享说明已经是面向市场的成功的大型项目,并不是只有某些人认为的手里的要让市面上Top200手机都跑得起来的“项目”才叫项目。
问:改不动UE源码就是你菜,就是你C++水平差,就是你不会写Graphics API。
答:您确定您不是在往铁板上踢??
问:答主有没有项目经验?
答:本人是已经参加工作的开发者,正在正面参与大型游戏的开发。 |