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

Unreal Engine地形系统辨析(三)

[复制链接]
发表于 2020-11-25 17:55 | 显示全部楼层 |阅读模式
最近在开发过程中发现了一个之前理解错误的功能点。早前我在文章里也提及每个landscape component都有自己专属的weightmap,后来知道其实这个看法是不对的。为了最大限度的利用landscape中的weightmap的四个channel,ue4会在landscapeproxy这个类中放置一个weightmapusagemap的变量,它里面记录着整个landscape中weightmap的使用状况,例如它可以知道weightmap每个channel正在被哪个landscape component占用着。当需要给某个component的某些layer分配weightmap时,就可以根据这个usagemap找到最合适需求且已存在的weightmap的空闲channel(如果找不到才会分配新的weightmap纹理)。这样做的结果是在同一个landscapeproxy中的component可以合理的共享weightmap,只不过channel的使用是互斥的,因此它大大提高了weightmap的利用率。但是得到一好必然带来一弊,由于共享了来自不同weightmap的channel,直接导致了shader permutation的数量激增,相当于材质要通过不同的条件分支来读取不同slot上的weightmap,显然shader cache所占用的内存也会随之变大。另外还有一个发现,就是material instance在做static permutation时(根据weight layer allocation info生成TerrainLayerWeightParameters传入UpdateStaticPermutation中),由于材质蓝图里的blend layer表达式是以layer name作为输入纹理的识别标志的,所以即使最终混合的层数相同,且weightmap使用数量也相同,但是FHLSLMaterialTranslator依然会把它们编译成不同的shader变体,这显然是一种冗余,因为它们生成的shader汇编码应该是一样的。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-20 01:26 , Processed in 0.103453 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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