首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新计算法线?

如何重新计算法线?
EN

Stack Overflow用户
提问于 2017-12-06 08:52:34
回答 3查看 2.9K关注 0票数 0

我正在试着写一个简单的着色器来移动所有的顶点。

代码语言:javascript
复制
v.vertex.y += sin(_Time.y * _Speed + v.vertex.x * _Amount * v.vertex.z) * _Distance;

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

有人能帮助我在移动顶点后重新计算法线的内容和方法吗?

EN

回答 3

Stack Overflow用户

发布于 2017-12-06 21:32:55

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

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

en.wikipedia.org/wiki/Cross_product

如果要从mesh类中移动网格,则会有一个RecalculateNormals。但我猜这不适用于这里,因为你在着色器上工作。

票数 1
EN

Stack Overflow用户

发布于 2017-12-22 19:28:51

曲面的法向量与其导数有关。在正弦波的情况下,它的导数就是余弦波cos()。两者都可以在一个称为的操作中高效地计算出来。

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

Everts之前的答案适用于您可以访问相邻顶点的情况,而您通常不能在着色器中访问这些顶点(但这在CPU上就可以了)。

票数 0
EN

Stack Overflow用户

发布于 2017-12-06 09:41:48

由于我自己没有这样做,所以我用谷歌搜索了一下,找到了this shader,它用来反转法线。它通过调整顶点信息来实现这一点:

代码语言:javascript
复制
    void vert(inout appdata_full v) {
        v.normal.xyz = v.normal * -1;
    }

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47665107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档