NVidia OptiX:在 PathTracer 示例中加载 OBJ

NVidia OptiX: Load an OBJ in the PathTracer example

在 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 向量。

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

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 端添加一些东西吗? 提前致谢!

P.S。我知道 loadMesh() 函数会处理 material,但由于该程序不起作用,我尝试设置 material,就像它为所有其他 GeometryInstances 显示的那样,如在上面的代码块中演示。

关于相交函数:

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

当你加载一个网格时,它(最常见的)是由三角形组成的,所以正在使用的相交函数不适合网格的几何形状(我想这解释了类型不匹配错误,但是消息不是很清楚,您没有 post 允许重现错误的完整示例)。

如何修复:

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

反之:

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