如何使用 Optix Context Wrapper 进行 rtPrint

How to rtPrint with 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);

一些背景资料

我正在尝试修改 optixWhitted 项目,在 CentOS 计算机上使用 Eclipse 的 NSight 版本。


问题

在使用 optixWhitted 代码时,并试图保持已经布局的代码风格和对象使用...我该如何解决这个问题?

进一步查看错误和上下文的原始实例化后,发现 optixWhitted 示例使用包装器 class 来处理 rtContext 对象。 这两个对象是不同的 classes 并且在进行一些挖掘时,我发现 NVIDIA 已经包含了 ContextObj class 作为底层 rtContext 的便利包装。此 ContextObj class 具有与 rtContext 非常相似的功能以及 OptiX 5.1 编程指南第 3 章中概述的功能。

查看 ContextObj class,您会发现用于设置 rtPrintf 设置的类似函数:OptiX ContextObj Wrapper Class.

具体来说,您会发现这些函数:

  • setPrintEnabled(bool)
  • setPrintBufferSize(uint)

最终工作代码

这是最终的工作代码,它使用了 ContextObj 包装器 class 已经存在并在 optixWhitted 教程中使用。

// 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() 方法并混合使用 APIs,但如果您使用其他 API 创建上下文,那么事情应该会起作用。

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

使用 OptiXpp API 还有其他好处,例如变量的括号表示法。简而言之,为了避免混淆,选择一个并坚持下去。