Как сделать rtPrint с помощью Optix Context Wrapper
Этот вопрос призван помочь новичкам NVIDIA OptiX (так же, как и я)
Что происходит
При работе с скомпилированными примерами OptiX (поставляется с установкой OptiX) я пытаюсь печатать на консоль из одного из ядер компьютера и получаю следующие ошибки:
error: cannot convert ‘optix::Context {aka optix::Handle<optix::ContextObj>}’ to ‘RTcontext’ for argument ‘1’ to ‘RTresult rtContextSetPrintEnabled(RTcontext, int)’
error: cannot convert ‘optix::Context {aka optix::Handle<optix::ContextObj>}’ to ‘RTcontext’ for argument ‘1’ to ‘RTresult rtContextSetPrintBufferSize(RTcontext, RTsize)’
Попытка решения
Внутри createContext()
Функция, в которой создается контекст, я добавил строки кода, чтобы включить отладочную печать. Строки кода, которые я добавил:
rtContextSetPrintEnabled(context, 1);
rtContextSetPrintBufferSize(context, 4096);
Это две строки, которые вызывают вышеуказанную ошибку. Я добавил эти строки кода после создания экземпляра объекта контекста, предоставленного приведенным ниже кодом - из исходного примера nvidia:
context = Context::create();
context->setRayTypeCount( 2 );
context->setEntryPointCount( 1 );
context->setStackSize( 2800 );
Итак, полный код, который ломается, выглядит так:
// Set up context
context = Context::create();
context->setRayTypeCount( 2 );
context->setEntryPointCount( 1 );
context->setStackSize( 2800 );
// Setup debug printing
rtContextSetPrintEnabled(context, 1);
rtContextSetPrintBufferSize(context, 4096);
Некоторая справочная информация
Я пытаюсь изменить проект optixWhinted, работая на компьютере CentOS, используя версию Eclipse NSight.
Вопрос
При использовании кода optixWhited и попытке сохранить стиль кода и использование объекта уже изложены... Как мне решить эту проблему?
1 ответ
Посмотрев далее на ошибку и первоначальное создание контекста, выясняется, что пример optixWhited использует класс-оболочку для обработки объекта rtContext. Эти два объекта - разные классы, и, немного покопавшись, я обнаружил, что NVIDIA включила класс ContextObj в качестве вспомогательной оболочки для базового rtContext. Этот класс ContextObj имеет функции, очень похожие на rtContext, и функции, описанные в главе 3 Руководства по программированию OptiX 5.1.
Просматривая класс ContextObj, вы найдете аналогичные функции для настройки параметров rtPrintf: OptiX ContextObj Wrapper Class.
В частности, вы найдете эти функции:
setPrintEnabled(bool)
setPrintBufferSize(uint)
Окончательный рабочий код
Это последний рабочий код, который использует класс-оболочку ContextObj, уже существующий и используемый внутри учебника optixWhited.
// Set up context
context = Context::create();
context->setRayTypeCount( 2 );
context->setEntryPointCount( 1 );
context->setStackSize( 2800 );
// Set Output Debugging via rtPrintf
context->setPrintEnabled(1);
context->setPrintBufferSize(4096);
Есть два основных способа использования OptiX API. В вашем вопросе вы создаете экземпляр своего контекста с помощью OptiXpp api, следовательно, указатель на методы и данные доступа. В этом случае,context
относится к типу optix::Handle<optix::ContextObj>
который не совпадает с типом, необходимым для rt
функции, в данном случае RTcontext *
. Вы также могли использоватьget()
на ручке и смешал API, но если бы вы создали свой контекст, используя другой API, все должно было работать.
RTcontext context;
rtContextCreate( &context );
rtContextSetPrintEnabled(context, 1);
rtContextSetPrintBufferSize(context, 4096);
Есть и другие преимущества использования OptiXpp
API, например, скобки для обозначения переменных. Короче говоря, чтобы избежать путаницы, выберите один и придерживайтесь его.