Godot的2D引擎在即将到来的4.0中获得了一些改进

2020-11-29 06:01:39

虽然Godot 4.0 Vulkan重写的重点主要是3D引擎的增强,但2D方面也将看到一些改进。

由于有了Vulkan(绘图调用成本比OpenGL低得多),Godot 4.0中的2D本身将免费获得加速。但这不是唯一的原因,许多内部改进和优化也有助于获得更流畅的体验。内存分配策略的变化以及绘制调用逻辑的内部简化,使得从节点的_draw()回调中手动调用数千个draw()函数更加有效。其中许多改进也将加速GLES3和GLES2后端。

Godot 3.x支持2D照明,但这在没有一些限制的情况下不会发生。主要的性能是由于在单独的绘制过程中渲染了每种灯光。在4.0中,这不再是一个问题,因为所有的光都是一次绘制的。

此外,所有2D阴影和光纹理均使用单个图集,从而提高了性能。

在2D中使用法线贴图也很容易出错。一些节点支持“正常”属性,并且照明的外观非常有限。

对于Godot 4.0,引入了新的CanvasTexture纹理类型。这种新的纹理类型可以在任何节点或资源中代替常规纹理使用,并且不仅提供常规贴图,而且还提供镜面贴图和光泽贴图,从而允许更复杂的2D照明和着色。

在下面的示例中,常规Button使用CanvasTexture,甚至UI也可以接收2D照明:

2D引擎非常需要的功能是可能具有2D定向光和阴影。由于新增了DirectionalLight2D节点,此功能已添加到4.0。

Godot 3.x中用户的另一个主要烦恼是,为了使动画或组合起来,精灵在许多节点中被分开了好几次。如果将着色器应用于它们,或者更改了透明度,则将效果分别应用于每个节点,前提是它们各自在自己的绘制调用中执行此操作。这会导致不希望的效果重叠(或不希望的透明效果,如下面的视频所示)

新的CanvasGroup节点合并了其子节点的绘制调用,从而使效果可以整体应用。

自定义着色器可以与CanvasGroup一起使用,也可以将阴影或光晕等效果作为单个对象应用于一组对象,从而大大增强了2D引擎的灵活性。

使用父形状轻松遮罩子2D节点的能力一直是Godot中最需要的功能之一。这仅适用于非常复杂的解决方法,例如使用视口或2D灯光,而这些方法又有限且效率低下。

在4.0分支中,由于可见性部分中的“ clip children”属性,这将以更简单的方式实现。这实际上是免费的,并允许最大的灵活性。

符号距离字段(或SDF)是3D图形中新的流行算法之一。他们允许做很多事情!从Godot 4.0开始,它们支持2D。常规的CanvasOccluders具有新的选项,可以启用它们进行SDF渲染。这意味着您可以从屏幕上的任何点请求到最接近的实体的距离。

这有几种用例,但是最常见的一种是圆跟踪。添加了一个新的API,以使其尽可能地容易。这是模拟2D光轴的长阴影(使用常规着色器将非常慢)的示例。

shader_type canvas_item; render_mode不受阴影;均匀的vec4颜色:hint_color;均匀的浮动角度:hint_range(0,360);均匀的浮动len:hint_range(0,1000)= 300;均匀的浮动fade_margin:hint_range(0,100)= 5;无效的fragment(){浮动ang_rad =角度* 3.1416 / 360.0; vec2 dir = vec2(sin(ang_rad),cos(ang_rad)); float max_dist = len; vec2 at = screen_uv_to_sdf(SCREEN_UV);浮点累加= 0.0; while(accum

使用SDF可以轻松实现大量其他效果,例如地板上的薄雾或热变形,2D全局照明,雨水打到地板效果,甚至整个屏幕的程序阴影。 SDF距离基于场景全局坐标,因此可以以熟悉的方式完成距离测量。

2D GPU粒子系统将通过SDF支持整个场景的粒子碰撞。希望用户将对该新功能进行许多其他有趣的使用。

2D引擎也正在做更多工作。 Gilles Roudiere正在研究一种新的2D tilemap系统,该编辑器有望克服当前系统的大部分限制。您可以在此Twitter帐户上关注他的进度。

与往常一样,请记住,我们是出于对您和整个游戏开发社区的热爱而使Godot脱颖而出的。我们希望制作最好,最容易使用的游戏引擎,并使其变得如此自由和开放,以至于您能感觉到自己制作的。如果您不是,请考虑成为我们的赞助人来帮助我们!