为什么我的金属 material 在网格上看起来完全是黑色的?

Why does my metal material looks completely black on meshes?

我一直在研究用 C++ 编写的光线追踪器,遵循这一系列书籍:Ray Tracing in One Weekend。 我开始自己尝试实现书中未描述的功能,例如使用 SAH、变换、三角形和网格的 BVH 树构建器。

注意:BVH 实现基于本文中的两个主要资源:Bounding Volume Hierarchies and C-Ray(用 C 编写的光线追踪器)。

在我实现所有这些之后,我注意到在尝试在网格上使用一些 material 时有些奇怪。例如,正如标题所说,金属 material 看起来完全是黑色的:

在第一张图片中,您可以看到金属 material 应该是什么样子,在第二张图片中,您可以看到它在网格上的样子。

我花了很多时间试图找出问题所在,但我找不到它,也找不到跟踪它的方法。

如果您想查看代码以更清楚地了解光线追踪器,请在 GitHub 上 https://github.com/ITHackerstein/RayTracer。 我在其上实现网格的分支是 meshes.

要复制我的构建环境,我建议您遵循以下构建说明:

$ git clone https://github.com/ITHackerstein/RayTracer

$ cd RayTracer

$ git checkout meshes

$ mkdir build

$ cd build

$ cmake ..

$ make

$ mkdir tests

此时你几乎可以开始了,除了你需要 TOML 场景文件和我正在使用的 OBJ 文件,这两个文件是:

下载它们并将它们放在 build/tests 中,然后使用以下命令确保您位于 build 文件夹和 运行 文件夹中:

$ ./RayTracer tests/boh.toml

完成 运行ning 后,您应该有一个 tests/boh.ppm 文件,它是使用 PPM 格式存储的结果图像文件。如果您没有可以让您打开它的软件,则有多个在线观众。

注意:我的平台是 Linux,我没有在 Windows 或 Mac OS. 上测试


编辑

Does the mesh work with other materials?

正如您在第一张图片中看到的那样,尤其是在第二张图片中,我们有一些较暗的矩形斑点,而且光线似乎有点混乱。在第三张图片中,您可以了解它是如何在普通图元上工作的。

感谢@Wyck 给我的提示,我终于弄明白了。 问题出在法线中,我注意到 Metal::scatter 方法收到的法线几乎为零。所以这就是它返回黑色的原因。 经过一些日志记录后,我发现 Instance::intersects_ray 方法没有规范化转换后的法线向量,这就是导致问题的原因。所以,最后,解决方案比我想象的要简单。