造树

这是一个关于如何从头开始制作树木和其他类型植被的简短教程。

其目的不是关注建模技术(有很多相关的教程),而是如何在Godot中使它们看起来更好。

../../_images/tree_sway.gif

从树开始

我从SketchFab上取下这棵树:

../../_images/tree_base.png

https://sketchfab.com/models/ea5e6ed7f9d6445ba69589d503e8cebf

在Blender里打开它。

使用顶点颜色绘制

你可能想做的第一件事是用顶点颜色来描绘有风时树会摇摆的程度。只需使用您最喜欢的3D建模程序的顶点颜色绘制工具,然后绘制如下内容:

../../_images/tree_vertex_paint.png

这有点夸张,但其想法是颜色表示摇摆对树的每个部分有多大的影响。这里的这个比例代表它更好:

../../_images/tree_gradient.png

为叶编写自定义明暗器

这是叶子着色的一个简单示例:

shader_type spatial;
render_mode depth_draw_alpha_prepass, cull_disabled, world_vertex_coords;

这是一个空间明暗器。不存在前/后剔除(这样可以从两侧看到树叶),并且使用了alpha预处理,因此使用透明度(和树叶投射阴影)产生的深度较小的arctifact。最后,对于摇摆效果,建议使用世界坐标,这样可以复制、移动树等,它仍然可以与其他树一起工作。

uniform sampler2D texture_albedo : hint_albedo;
uniform vec4 transmission : hint_color;

在这里,读取纹理,以及传输颜色,用于向树叶添加一些背光,模拟次表面散射。

uniform float sway_speed = 1.0;
uniform float sway_strength = 0.05;
uniform float sway_phase_len = 8.0;

void vertex() {
    float strength = COLOR.r * sway_strength;
    VERTEX.x += sin(VERTEX.x * sway_phase_len * 1.123 + TIME * sway_speed) * strength;
    VERTEX.y += sin(VERTEX.y * sway_phase_len + TIME * sway_speed * 1.12412) * strength;
    VERTEX.z += sin(VERTEX.z * sway_phase_len * 0.9123 + TIME * sway_speed * 1.3123) * strength;
}

这是创建树叶摆动的代码。它是基本的(只使用正弦波乘以时间和轴的位置,但效果很好)。请注意,强度乘以颜色。每个轴使用一个不同的接近1.0的小乘法系数,这样轴就不会同步显示。

最后,剩下的就是片段着色:

void fragment() {
    vec4 albedo_tex = texture(texture_albedo,UV);
    ALBEDO = albedo_tex.rgb;
    ALPHA = albedo_tex.a;
    METALLIC = 0.0;
    ROUGHNESS = 1.0;
    TRANSMISSION = transmission.rgb;
}

差不多就是这样。

主干明暗器类似,只是它不写入alpha通道(因此不需要alpha预处理),也不需要传输来工作。这两个明暗器都可以通过添加法线贴图、AO和其他贴图进行改进。

改进明暗器

关于如何做到这一点,您可以阅读更多的资源。既然您已经了解了基础知识,那么推荐阅读GPU GEMS 3中关于Crysis如何做到这一点的章节(主要关注Swy代码,因为许多其他技术都已过时):

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch16.html