0

这个问题旨在帮助 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 项目,在使用 Eclipse 的 NSight 版本的 CentOS 计算机上工作。


问题

在使用 optixWhitted 代码时,并尝试维护已经布置的代码样式和对象用法......我该如何解决这个问题?

4

2 回答 2

1

有两种使用 OptiX API 的基本方法。在您的问题中,您使用 OptiXpp api 实例化您的上下文,因此是访问方法和数据的指针。在这种情况下,contextis 的类型与函数optix::Handle<optix::ContextObj>所需的类型不同rt,在这种情况下为RTcontext *。您也可以get()在句柄上使用该方法并混合 API,但如果您使用其他 API 创建上下文,那么事情应该会奏效。

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

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

于 2019-08-01T21:36:59.477 回答
0

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

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

具体来说,您会发现以下功能:

  • setPrintEnabled(bool)
  • setPrintBufferSize(uint)

最终工作代码

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

// 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);
于 2018-09-12T00:42:26.587 回答