NVidia OptiX:在PathTracer示例中加载OBJ

时间:2018-10-24 11:21:12

标签: nvidia optix

在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);

请注意,gisGeometryInstance向量。

当我运行它时,显示窗口将打开,然后立即关闭,并且出现以下异常:

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()函数会处理材料,但是由于该程序无法正常工作,因此我尝试设置材料,就像为所有其他GeometryInstance所显示的一样,如上面的代码块所示。 / p>

1 个答案:

答案 0 :(得分:1)

关于相交功能:

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

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

如何解决:

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

另一种方式:

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