在维京殖民地模拟游戏《Jarl》中,草几乎始终占据着屏幕——因为世界的大部分区域是草原和森林。开发者Jarl Frode近日发布了一篇精彩的技术拆解,讲解如何用计算着色器(compute shader)实现2D草地渲染。 《Jarl》是一款灵感来自《Valheim》《RimWorld》《泰拉瑞亚》《The Majesty》和《The Kingdom》的维京殖民地模拟游戏,采用像素艺术风格、2D全局光照渲染器,世界为程序化生成并按区块流式加载。正因为草地几乎无处不在,草地系统既要足够程序化、足够廉价以覆盖大面积区域,又要贴合美术风格,还能对光照、风力以及生物穿行做出动态响应。 文章最令人意外的结论是:画面中看到的草并不是几何体。整个系统将草地视为图像而非几何。为了保持简单,游戏中没有草叶实体、没有网格、也没有持久状态——每帧由两个计算着色器从哈希中重新生成所有可见草叶,逐像素写入一块与屏幕等大的原子缓冲,再由合成器将其排入场景。 按照Jarl Frode的说法:"这不是最快的方法,但在现阶段开发中,是符合性能目标的合理选择:在RTX 3080 Ti上、4K分辨率、调优参数下,整个pass稳稳低于1毫秒。" 每一帧,草地都会从零重建。计算着色器遍历可见屏幕tile,查询一张小尺寸密度纹理以确定该处草的茂密程度,然后根据tile坐标和索引的哈希生成每一根草叶。哈希决定了草叶的一切属性——它在tile内的位置、高度、颜色变化、摆动相位。由于哈希输入是世界坐标,无论摄像机如何移动,同一根草叶每帧都会出现在同一位置。 在拆解文章中还附有交互式demo,你可以亲自探索该系统,并查看风场、深度缓冲、密度遮罩等更多可视化内容。

打开网易新闻 查看精彩图片