Godot 顶点着色器可沿路径弯曲网格(类似于 Blender 的“曲线”修改器)

问题描述 投票:0回答:1

类似问题:沿样条曲线弯曲网格


我正在尝试做的事情:

我想创建一个 Godot 顶点着色器,它沿着

Path3D
弯曲网格,类似于 Blender 中“曲线”修改器的工作方式。

这是一个例子:


到目前为止我所做的:

我制作了这个着色器。

void vertex() {
    vec3 vertex_norm = vec3(
        VERTEX.x / curve_length,
        VERTEX.y / curve_length,
        VERTEX.z / curve_length
    );

    vec3 curve_position = texture(positions, vec2(vertex_norm.y, 0.0)).xyz;
    vec3 curve_normal = texture(normals, vec2(vertex_norm.y, 0.0)).xyz;
    vec3 curve_binormal = texture(binormals, vec2(vertex_norm.y, 0.0)).xyz;

    curve_normal *= VERTEX.z;
    curve_binormal *= VERTEX.x;

    vec3 offset = curve_normal + curve_binormal;

    VERTEX = curve_position + offset;
}

以下是它在幕后的工作原理:

  1. 曲线是从
    Path3D
    获得的,并按照预定义的次数进行采样。 (在
    for
    循环中)
  2. 对于每个样本,都会调用
    curve.sample_baked_with_rotation(offset)
    ,为我们提供曲线每个样本的位置、法线和副法线。
  3. 创建了三个
  4. FORMAT_RGBF
     
    Image
     - 每个都包含以 rgb 值编码的位置、法线和副法线。纹理的宽度是样本数量,高度是 1px。
    
      例如,如果我们使用 128 个样本,则图像的宽度为 128px。
  5. 这些图像随后被转换为
  6. ImageTexture
     并与曲线的总长度一起传递到着色器。 (
    curve_length
    变量)

什么不起作用:

破碎的顶点有些顶点会做这种奇怪的事情,我不知道如何准确地描述它。我认为这可能是由于负 我尝试将顶点的
y
 值而发生的,但我不确定。
y
 坐标固定到 
(0.0, 1.0)
 但没有帮助。
曲线的方向打破了阴影曲线的方向影响阴影,导致曲线断裂。在屏幕截图中,阳光实际上是从另一个方向照射的。

所以问题是……

如何解决这些问题并使这个 Godot 着色器的行为就像 Blender 中的“曲线”修改器一样?


此外,如果曲线比网格短,是否可以使网格永远不会被截断? (见下面的截图)

曲线比网格长曲线比网格短,但网格没有被截断
谢谢!

3d shader godot vertex-shader godot-shader-language
1个回答
0
投票
在我看来,示例视频在网格的底部使用了一些“特殊情况”逻辑,将顶点添加到弯曲外侧“拉伸”的一侧,并且仅“夹紧”“压缩”上的顶点侧面向上达到一定角度,之后允许它们在底部下方“走向负值”(尽管请注意,在极端角度时,网格底部的那一侧有一点曲率)

我猜测 Blender 的曲线修改器在添加额外顶点时没有问题,尽管顶点着色器可能会出现问题?

对于第二个问题,这不就是简单地将

curve_position.y

缩放为
mesh_length / curve_length
吗?我想你需要在着色器之外计算 
mesh_length
 并将其传递进去......

© www.soinside.com 2019 - 2024. All rights reserved.