很久以前,我发布了一篇关于一些平滑生长的草的文章,人们对此感兴趣。因此,在我的steam页面上线的庆祝中,我将在这里写一篇详细的文章,说明它如何工作。

涉及的有三个地形和四个摄像机。

1)遮罩地形

Plus 一个2D摄像机,从上面渲染一些未点亮的白色遮罩对象,以及一个摄像机渲染仅仅地形并应用遮罩到它上面的一张渲染纹理。

2)绿色地形

Plus 渲染草地地形和任何具有深度的对象的摄像机(除了沙地和遮罩地形)。

3)沙地地形

Plus 渲染除草地(2)和遮罩地形(3)外的所有对象的摄像机。

我选择这个设置是因为我想能够独立设计沙地和绿色地形(还有修改地形噪音图是很痛苦的)。

沙地、绿色和遮罩地形(注意,草实际上是渲染在沙地上,而不是绿色地形,中间的图像只是编辑器中看到的样子,而不是实际渲染的样子)

遮罩

遮罩地形的纹理源是从一个2D摄像机中生成的,摄像机指向直下。它渲染一些特定的白色和未点亮的对象,这些对象组成了遮罩区域,可以通过代码控制(就是水壶在运行时创建的)。

结果是动态遮罩,我可以轻松地根据任何游戏对象(或逻辑)来改变它。遮罩对象被组合成更大的块来优化性能,但我可能会在将来用纹理来替代它。

https://preview.redd.it/uee5z3be3ckh1.png?width=1342&format=png&auto=webp&s=8f50b0305c3f6d575910690f8933224154ec9c3f

另外,2D摄像机就是模糊的地方。它将锐利的2D遮罩图像模糊,然后将其输入到系统(渲染纹理+着色器)中,慢慢地将当前2D摄像机遮罩结果变化。这样,模糊和模糊就发生在GPU上。

结果是一个用于INPUT的渲染纹理,这个纹理被用于遮罩地形。然后,一个3D摄像机跟随玩家,渲染这个地形的结果再次被用于最终的组合中。这个摄像机的结果是再次被用于最终的组合中。优势是虽然2D摄像机相对低分辨率,但我仍然可以通过3D摄像机获得高分辨率遮罩。模糊也帮助掩盖了低2D分辨率。这些摄像机都不会直接绘制到帧缓冲区中。

绿色

草地摄像机渲染草地地形和所有具有深度的对象(需要填充深度缓冲区)。然后,它将结果(颜色和深度)存储到渲染纹理中,用于最终的组合步骤。这个摄像机也不会直接绘制到帧缓冲区中。

https://preview.redd.it/3styy4be3ckh1.png?width=2326&format=png&auto=webp&s=711ce12ad32c0504019fac2862e8a51a08aced2f

沙地

沙地地形和摄像机是所有东西的结合点。它将自己的深度纹理(包括透明的草地)与绿色地形深度相结合。

结果再次被与3D遮罩纹理相结合,得到最终的遮罩图像。

这个图像然后被叠加到沙地地形摄像机上,得到最终的图像。

https://preview.redd.it/o0hmz4be3ckh1.jpg?width=4368&format=pjpg&auto=webp&s=7744ef7b8ca745bee8238f695df27e451e2de4bd

https://preview.redd.it/ss2e94be3ckh1.png?width=1227&format=png&auto=webp&s=267f83890bee1792697f24dd9987685ed3e30f83

草本身是使用GPU实例和一个自定义着色器来渲染的,着色器接受草地噪音图的颜色和密度图。这样我就可以控制草的密度,不仅仅是全局地通过着色器,而且也可以在地形上局部地控制它。这样我就可以像任何普通的地形细节一样轻松地绘制它。

可能看起来有点复杂(确实是这样),但这有一个优势:它可以与任何地形系统和着色器一起工作,并且给我提供了很多控制权。

然而,主要的缺点是我必须基本上渲染场景两次,尽管我尝试使用层来渲染每个摄像机只渲染真正需要的内容。

如果有人想知道更多关于最终的(或观看预告片),可以在这里找到更多信息:https://superbloom.kamgam.com/

希望这个可以理解。欢迎提问和/或评论 :-)