提问人:reptofrog 提问时间:11/15/2023 最后编辑:reptofrog 更新时间:11/18/2023 访问量:96
Godot 顶点着色器,用于沿路径弯曲网格(类似于 Blender 的“曲线”修改器)
Godot vertex shader to bend a mesh along a path (similar to the Blender's "Curve" modifier)
问:
类似问题:沿样条弯曲网格
相关新闻: 如何使用几何节点折弯几何图形
相关新闻: Unity Curve Modifier
我想做什么:
我想创建一个 Godot 顶点着色器,它沿着类似于 Blender 中“曲线”修改器的工作方式弯曲网格。Path3D
下面是一个示例:
到目前为止,我做了什么:
我制作了这个着色器。
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;
}
以下是它在幕后的工作原理:
- 曲线是从 获得的,并对预定义的次数进行采样。(循环)
Path3D
for
- 对于每个样本被调用,为我们提供了曲线中每个样本的位置、法线和双法线。
curve.sample_baked_with_rotation(offset)
- 创建三个 s - 每个 s 都包含以 RGB 值编码的位置、法线和双法线。纹理的宽度是样本量,高度为 1px。
FORMAT_RGBF
Image
- 例如,如果我们使用 128 个样本,则图像的宽度为 128px。
- 然后,这些图像被转换为 s,并与曲线的总长度一起传递到着色器。(变量)
ImageTexture
curve_length
什么不起作用:
破损的顶点 |
---|
![]() |
有些顶点会做这种奇怪的事情,我不确定如何准确描述它。我想这可能是因为负值而发生的,但我不确定。y |
我试过将顶点的坐标夹紧,但没有帮助。y (0.0, 1.0) |
曲线的方向打破了阴影 |
---|
![]() |
曲线的方向会影响阴影,并且会中断。在屏幕截图中,太阳实际上是从另一个方向照射进来的。 |
所以问题是......
如何解决这些问题并使这个 Godot 着色器的行为就像 Blender 的“曲线”修改器一样?
此外,是否可以使网格在曲线短于网格时永远不会被截断?(见下面的截图)
曲线比网格长 | 曲线比网格短,但网格不会被截断 |
---|---|
![]() |
![]() |
谢谢!
答:
1赞
Biggles
11/18/2023
#1
在我看来,示例视频在网格的底部使用了一些“特殊情况”逻辑,在弯曲外侧“拉伸”的一侧添加顶点,并且仅将“压缩”侧的顶点“夹紧”到一定角度,之后允许它们在底部下方“变负”(尽管请注意,在极端角度下,底部的那一侧有一点曲率的网格)
我猜 Blender 的曲线修改器在那里添加额外的顶点没有问题,尽管顶点着色器可能会?
对于第二个问题,这难道不就是一个简单的按比例缩放的情况吗?我想你需要在着色器之外进行计算并传入它......curve_position.y
mesh_length / curve_length
mesh_length
评论
0赞
reptofrog
11/18/2023
我不确定是否有任何特殊逻辑 - 没有添加新的顶点。(我检查过)至于第二个问题,谢谢你的提示,我会尝试一下。
评论
repeat_disable
sampler2d