1

在 SDK 中的路径跟踪器示例中,我想添加一个 OBJ 文件进行跟踪,所以我转到了loadGeometry()函数,在最后一次创建平行四边形之后,我添加了这个代码块

OptiXMesh mesh;
mesh.context = context;
loadMesh(mesh_file, mesh);
gis.push_back(mesh.geom_instance);
//setMaterial(gis.back(), diffuse, "diffuse_color", white);

请注意,这gis是一个GeometryInstance向量。

当我运行它时,显示窗口打开,然后立即关闭,我得到以下异常:

Exception thrown at 0x00007FFA2856A388 in optixPathTracer.exe: Microsoft C++ exception: optix::TypeMismatch at memory location 0x0000000E29EFF030.
Exception thrown at 0x00007FFA2856A388 in optixPathTracer.exe: Microsoft C++ exception: optix::Exception at memory location 0x0000000E29EFF5C0.

如果我注释掉修改后的代码块,它工作正常。

如何将 OBJ 文件加载到跟踪器?我需要在着色器/RT_PROGRAMs 端添加一些东西吗?预先感谢!

PS 我知道该loadMesh()函数负责处理材料,但由于程序不起作用,我尝试设置一个材料,就像它为所有其他 GeometryInstances 显示的一样,如上面的代码块所示。

4

1 回答 1

1

关于相交功能:

在路径跟踪器示例中,场景由平行四边形组成。在 parallelogram.cu 文件中,OptiX 管道调用 intersect 函数来检测光线是否与平行四边形(4 点形状)相交。在 OptixPathTracer.cpp 中,在 createParallelogram 方法中,将交集程序设置为 parallelogram.cu 文件中的函数。

当您加载网格时,它(最常见)由三角形组成,因此正在使用的 intersect 函数不适合网格的几何形状(我猜这解释了 TypeMismatch 错误,但消息不是很清楚并且您没有发布允许重现错误的完整示例)。

怎么修:

如果您查看光线投射示例,在 OptixRaycastingContext.cu 中有一个为三角形制作的 intersect 函数。您很可能应该将该三角形相交函数复制到您的 cu 文件中(不要忘记重命名它:那里已经有一个用于平行四边形的截距函数),然后当您为网格创建 Geometry 对象时,使用 setIntersectionProgram 调用三角形相交函数作为参数。

另一种方法:

您还可以开始研究网格查看器示例并更改光线跟踪代码(cu 文件)以进行路径跟踪。了解 OptiX 的工作原理是一个很好的练习。

于 2019-01-21T09:43:18.070 回答