0

我正在尝试编写一个简单的着色器,用正弦波移动所有顶点。

v.vertex.y += sin(_Time.y * _Speed + v.vertex.x * _Amount * v.vertex.z) * _Distance;

问题是在移动它们之后,法线是错误的,因此没有实时阴影。我搜索了很多,发现我需要使用假邻居重新计算法线。这些实现都不是针对 Unity Shaderlab 的,所以我不能只是复制和粘贴它们,而且我对着色器代码的了解非常基础,所以我无法将我发现的内容转换为我需要的内容。

任何人都可以帮助我在移动顶点后重新计算法线的内容和方法吗?

4

3 回答 3

1

正常计算背后的数学是叉积。

从三角形中取顶点 A、B 和 C。然后创建向量 AB 和 AC。ABxAC 会给你三角形的法线。ACxAB 将给出相反的正常值 (ABxAC = - ACxAB)。

en.wikipedia.org/wiki/Cross_product

如果要从 Mesh 类中移动网格,则有一个 RecalculateNormals。但我想这在您处理着色器时并不适用。

于 2017-12-06T13:32:54.927 回答
0

表面的法向量与其导数有关。在正弦波的情况下,它的导数只是余弦波cos()两者都可以在名为sincos()的单个操作中有效计算。

完美的介绍练习:) 绘制两者并观察关系

当您可以访问相邻顶点时,Everts 的上一个答案有效,而在着色器中通常不会这样做(但这在 CPU 上会很好)。

于 2017-12-22T11:28:51.300 回答
-1

我自己没有这样做,我做了一点谷歌并找到了这个着色器,用于反转法线。它通过调整顶点信息来做到这一点:

    void vert(inout appdata_full v) {
        v.normal.xyz = v.normal * -1;
    }

您应该能够调整着色器以根据其他更改重新计算法线方向并以类似方式更新它。

于 2017-12-06T01:41:48.023 回答