为什么我的金属 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 文件,这两个文件是:
- boh.toml(场景文件)
- teapot.obj(茶壶 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
方法没有规范化转换后的法线向量,这就是导致问题的原因。所以,最后,解决方案比我想象的要简单。
我一直在研究用 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 文件,这两个文件是:
- boh.toml(场景文件)
- teapot.obj(茶壶 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
方法没有规范化转换后的法线向量,这就是导致问题的原因。所以,最后,解决方案比我想象的要简单。