将世界空间法线转换为屏幕空间法线

10
什么是将世界空间中定义的表面法线转换为屏幕空间中法线的适当方法?我认为它们不能简单地乘以投影矩阵,因为透视除法将事物转换为剪辑空间,并且据我所知,在此空间中,与图像平面共面的平面保持共面。但我正在寻找的转换应该导致变换后的法线不同,如图A中所示的蓝色世界法线应该产生不同的屏幕空间法线(因为即使它们的平面与图像平面共面,它们也没有面向相机) - 另一方面,图B中所示的法线在变换后应该是(或多或少)相等的,因为它们的表面朝向相机。

enter image description here

我需要的是什么变换?如何计算?
我需要这个来实现一些屏幕空间特效。

你的例子是错误的。屏幕空间看起来和工作方式都不是那样的。它是投影到平面上,而不是球体上。 - Tara
3个回答

1

您正在寻找关于基变换矩阵的相关知识。这里有一段非常好的视频,介绍了如何计算这个矩阵。请查看KhanAcademy video

编辑

您没有提供任何关于所使用技术的信息(OGL、DX、着色器、自己的投影等),但是您应该阅读一些关于切线空间的文章,例如Messing with Tangent Space


我知道如何将法线从切线空间转换到物体空间或世界空间,反之亦然。但这并不包括屏幕空间。 - matthias_buehlmann
但是一些物体的法线如何与屏幕空间相连呢?法线始终是法线,无论从哪个点看它们都是这样。 - Sorceror

1

尝试按照通常的方式进行转换,从模型(到视图)空间中使用逆转置矩阵。


1
这个并不涵盖我的问题。这是关于正确地将法线转换到眼空间的问题,而不是关于投影的问题。 - matthias_buehlmann
1
是的,我明白这并不简单。在你的情况下,正常变换的结果取决于具有该法线的表面的位置... - kerim
@user1282931 - 你能否在眼空间中执行屏幕空间特效? - kerim
准确地说,每个法向量的起源都会影响结果!不,我不能在眼空间中执行它们。我需要根据屏幕空间法向量计算纹理查找。 - matthias_buehlmann
1
然后,可能只需转换(project)正常和另一个点(由该正常移位的原点)。然后,在投影空间中重新计算这两个转换点的法线。 - kerim
请注意,变换后的法线是一条曲线,不再是一条直线。因此,如果您选择沿着法线任意点进行变换,然后连接到变换后的原点,最多只能得到一个近似值,而不是准确的投影法线。准确的投影法线是通过将变换差与原始偏移逐渐趋近于零的极限得到的。 - kvark

1
假设您想通过任意4x4矩阵将点P处的普通N进行转换。让我们用模型部分T(包括旋转、缩放和平移)和最后一行的部分W来表示矩阵。这使我们可以说:
Transform(P) = (T * P) / dot(W,P)

现在,投影法线可以看作是以下极限(d -> 0)的结果:
(Transform(P+dN) - Transform(P)) / d

将这个方程式展开,然后从分子和分母中都划掉"d",得到以下公式:

dot(W,N) * (Transform(N) - Transform(P)) / dot(W,P)

这是未经测试和验证的,但考虑到此问题缺乏积极答案,我想尝试一下 ;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接