我正在编写一个基本的raytracer,并实现了法线贴图。但是,使用法线贴图时,有时生成的光线与曲面的几何法线相反,因此光线到达对象后面的光源。如果我杀死光线,则阴影效果看起来是多面的,并且表面法线很明显。如果不杀死射线,射线会到达几何体另一侧的光源。

如何正常处理?

评论

相反方向的频率是多少?如果它们偶尔出现在内部,则可能不是一个数学精度错误。如果它们通常是错误的方式,则可能是您的切线和双切线向量或数学错误。如果几乎总是错误,那可能是由于左手和右手的混合使用造成的。

您可以共享您的代码吗?

#1 楼

据我所知,这是一个没有适当解决方案的问题。您会看到着色法线和几何法线之间的差异,显而易见,着色法线只是一个把戏。 PBRT在这方面有一段,他们的解决方案是查看几何法线以确定是调用BRDF(反射)还是BTDF(透射),然后将阴影法线传递给BxDF。尽管如此,这并不是在所有情况下都有效。

对于经生产验证的渲染引擎,此问题也是已知的并已描述:
http://blog.irayrender.com/post/29042276644 / shadow-acne-and-the-shadow-terminator
为iRay建议的解决方案是使用位移贴图而不是法线贴图。这样,阴影和几何法线再次一致。

#2 楼

我看到完成的一件事是,当产生射线时,位置在法线上移动。基本上将法线乘以少量。
如果要遮盖脸部的背面,则需要反转法线。

原因是例如,当光线在脸后面时,您会投射光线。没有偏移量,原点正好在面部,因此t为0。算法将其视为不命中,因此沿法线的偏移量使t不再为0。

我希望这能回答。

评论


$ \ begingroup $
问题实际上是不同的,不是因为我错过了一个交集,而是因为阴影法线创建的射线对阴影法线有效,但对曲面几何法线无效。
$ \ endgroup $
–anonymoose2121
16 Dec 10'在18:07

$ \ begingroup $
您的意思是,所产生的某些射线不在几何法线的半球上吗?就像您要创建具有射线方向和几何法线的点积一样,它最终是否为负?据我所知,这只是被忽略。不知道当您拥有那种东西时,您实际上会得到哪种伪像。您能否显示一些文物的图片?
$ \ endgroup $
–bram0101
16 Dec 10'在19:04