我正在试着写一个简单的着色器来移动所有的顶点。
v.vertex.y += sin(_Time.y * _Speed + v.vertex.x * _Amount * v.vertex.z) * _Distance;问题是,在移动它们之后,法线是错误的,因此没有实时阴影。我搜索了很多次,发现我需要使用假邻居重新计算法线。这些实现都不是Unity Shaderlab的,所以我不能只是复制和粘贴它们,而且我对着色器代码的了解非常基础,所以我不能将我找到的转换成我需要的。
有人能帮助我在移动顶点后重新计算法线的内容和方法吗?
发布于 2017-12-06 21:32:55
正常计算背后的数学原理是叉积。
从三角形中取出顶点A,B和C。然后创建矢量AB和AC。ABxAC将为您提供三角形的法线。ACxAB将给出相反的正态(ABxAC =- ACxAB)。
en.wikipedia.org/wiki/Cross_product
如果要从mesh类中移动网格,则会有一个RecalculateNormals。但我猜这不适用于这里,因为你在着色器上工作。
发布于 2017-12-22 19:28:51
曲面的法向量与其导数有关。在正弦波的情况下,它的导数就是余弦波cos()。两者都可以在一个称为的操作中高效地计算出来。
完美的介绍练习:)绘制两者并观察relationship。
Everts之前的答案适用于您可以访问相邻顶点的情况,而您通常不能在着色器中访问这些顶点(但这在CPU上就可以了)。
发布于 2017-12-06 09:41:48
由于我自己没有这样做,所以我用谷歌搜索了一下,找到了this shader,它用来反转法线。它通过调整顶点信息来实现这一点:
void vert(inout appdata_full v) {
v.normal.xyz = v.normal * -1;
}您应该能够调整着色器以基于其他更改重新计算法线方向,并以类似的方式更新它。
https://stackoverflow.com/questions/47665107
复制相似问题