《小大脚》的独立开发者,这是一款温馨的潜行冒险游戏,主角是由护林员抚养长大的小大脚怪。玩家所做的一切(烹饪、钓鱼、搜刮)几乎都是伪装成人类的日常活动。本周我完成了第一个只有大脚怪能做的动作:踢果树,让1-2个苹果晃落到地上。

有趣的问题不在于踢的动作,而是如何让玩家看到这个结果。苹果树的树冠正好挡在镜头和玩家之间,导致掉落的苹果落在玩家看不见的地面上。简单的解决方法是给材质添加遮挡剔除的关键词,但苹果和树干使用的材质在场景中分别关联了3000多个和1300多个渲染器,而片段着色器的clip()函数会使每个使用该材质的渲染器都产生早期Z缓冲开销。如果直接给共享资源启用这个关键词,整个公园三分之一的地形都要为此买单,只为在一棵树上开个洞。最终的解决方案是:在运行时,将需要参与遮挡的渲染器替换为另一个携带关键词的、完全相同的材质变体,其他渲染器完全不受影响。

最喜欢的迭代瞬间:这个遮挡剔除功能把地面上的苹果也切出了洞。挂着的果实和掉落的果实用的是相同的网格和材质,所以“哪些苹果应该变透明”根本无法通过资源本身来区分。必须由运行时根据苹果的归属来决定。我提出一个修正后,模型从基于资源的结构重构为基于所有权的结构。

下面是演示片段。如果有人好奇我是如何组织开发阶段的,我很乐意分享。