如何重新计算法线?

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

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

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

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

任何人都可以帮助我在移动顶点后如何重新计算法线?

unity3d shader unity5 shaderlab
3个回答
1
投票

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

从三角形中取出顶点A,B和C.然后创建向量AB和AC。 ABxAC将为您提供三角形的法线。 ACxAB将给出相反的法线(ABxAC = - ACxAB)。

恩.Wikipedia.org/wiki/cross_product

如果要从Mesh类移动网格物体,则会有RecalculateNormals。但我想这不适用于你在着色器上工作。


1
投票

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

完美的介绍运动:)情节两者并观察relationship

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


-1
投票

我自己没有这样做,我做了一点googly,发现this shader,用于反转法线。它通过调整顶点信息来实现:

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

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

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