Unreal Engine地形系统辨析(三)
最近在开发过程中发现了一个之前理解错误的功能点。早前我在文章里也提及每个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汇编码应该是一样的。
页:
[1]