NVidia OptiX: загрузите OBJ в примере PathTracer - PullRequest
0 голосов
/ 24 октября 2018

В примере path tracer в 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,как показано в блоке кода выше.

1 Ответ

0 голосов
/ 21 января 2019

О функции пересечения:

В примере трассировщика пути сцена состоит из параллелограммов.В файле parallelogram.cu функция пересечения вызывается конвейером OptiX, чтобы определить, пересекает ли луч параллелограмм (форма 4 точки).В OptixPathTracer.cpp в методе createParallelogram программа пересечения задается как функция в файле parallelogram.cu.

Когда вы загружаете сетку, она (чаще всего) состоит из треугольников, поэтому пересечениеИспользуемая функция не подходит для геометрии сетки (и я думаю, это объясняет ошибку TypeMismatch, но сообщение не очень четкое, и вы не опубликовали полный пример, который позволяет воспроизвести ошибку).

Как исправить:

Если вы посмотрите на пример приведения лучей, в OptixRaycastingContext.cu есть функция пересечения, созданная для треугольников.Скорее всего, вам следует скопировать эту функцию пересечения треугольника в ваш файл cu (не забудьте переименовать ее: там уже есть функция перехвата, которая используется для параллелограммов), затем, когда вы создаете объект Geometry для вашей сетки, вызывайте setIntersectionProgram сфункция пересечения треугольника в качестве параметра.

Другой способ:

Вы также можете начать работу с примером средства просмотра сетки и изменить код трассировки лучей (cu-файлы), чтобы выполнить трассировку пути.Это хорошее упражнение, чтобы понять, как работает OptiX.

...