Как сделать rtPrint с помощью Optix Context Wrapper - PullRequest
0 голосов
/ 12 сентября 2018

Этот вопрос предназначен для начинающих пользователей 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);

Некоторая справочная информация

Я пытаюсь изменить проект optixWhitted, работая на компьютере CentOS, используя версию Eclipse NSight.


Вопрос

При использовании кода optixWhitted и попытке сохранить стиль кода и использование уже выложенного объекта ... Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 02 августа 2019

Существует два основных способа использования API OptiX. В своем вопросе вы создаете свой контекст, используя API OptiXpp, отсюда указатель на методы доступа и данные. В этом случае context имеет тип optix::Handle<optix::ContextObj>, который отличается от типа, необходимого для функций rt, в данном случае RTcontext *. Вы могли бы также использовать метод get() на дескрипторе и смешивать API, но если бы вы создали свой контекст, используя другой API, то все должно было работать.

RTcontext context;
rtContextCreate( &context );
rtContextSetPrintEnabled(context, 1);
rtContextSetPrintBufferSize(context, 4096);

Существуют и другие преимущества использования OptiXpp API, такие как обозначение скобок для переменных. Короче говоря, чтобы избежать путаницы, выберите один и придерживайтесь его.

0 голосов
/ 12 сентября 2018

Посмотрев далее на ошибку и первоначальное создание контекста, выясняется, что пример 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);
...