游戏开发中为什么要控制模型的面数

首先,面数越多,VS的调用会越多,开销越大。PC级别的显卡目前对VS的开销不太敏感,但是移动端性能有限,还是尽量注意。

其次,为了在shader里支持ddx和ddy相关的功能(即使你不调用这两个接口,内部也是需要这个功能的,比如纹理采样中需要计算出mipmap值),GPU里处理像素是以2x2为单位的。网上摘的一段话:

The pixel shader always processes 2 X 2 groups of pixels (called "quads") but there is no other part of a GPU that necessarily does. Quads exist for the purpose of mip mapped texture filtering; if you compute texture coordinates for each pixel in a 2 X 2 quad, you can do a little bit of math on the four coordinates to determine which mip maps should be sampled.

This is one of many reasons why a GPU is poor at rendering tiny triangles. A one-pixel triangle is shaded as a 2 X 2 quad, which wastes 75% of pixel shader resources.

如果三角形数量达到像素级别,那么会带来大量的冗余处理,这也是为什么UE5里的Nanite采用了Visibility buffer。

还有,对于移动端GPU来说,采用的架构是TBR或者TBDR,VS的处理结果不会按照正常的渲染管线直接进行下一步的光栅化,而是先从片上高速缓冲区写入进系统内存,然后逐tile渲染时又会回读。实质上就是用将顶点数据读写进系统内存替换帧缓冲区的读写。如果顶点数量太多,那就成了负优化了,因为VS里出来的顶点的属性还是挺多的。关于这一点,可能架构不一样会导致实际上不一样。上面的确是在某个硬件厂商的官方文档看到的,印象里是Arm官方的。但是高通官方的《Game Optimization for Mobile GPU》里的“Binning/Tiling Architecture”一节里讲:每个bin(也就是tile)有一个三角形的Visibility Stream,说白了Visibility Stream里包含了每个像素对应的可见的三角形。这样,GMEM(有的厂商叫on-chip cache)resolve到系统内存的数据就是恒定的,跟面数没有关系。题外话:UE5里的Nanite使用的Visibility buffer是不是就是借鉴自这个呢?

常用的减少面数的手段有LOD、视锥剔除、遮挡剔除等,最新的技术有UE5的Nanite。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值