如何使用Optix Context Wrapper进行rtPrint

时间:2018-09-12 00:30:27

标签: optix

这个问题旨在帮助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);

一些背景信息

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


问题

虽然使用optixWhitted代码,并尝试维护已经设计好的代码样式和对象用法...我该如何解决呢?

2 个答案:

答案 0 :(得分:0)

进一步查看错误和上下文的原始实例之后,事实证明optixWhitted示例使用包装器类来处理rtContext对象。 这两个对象是不同的类,在进行一些挖掘时,我发现NVIDIA包括了ContextObj类,作为基础rtContext的便捷包装。该ContextObj类具有与rtContext非常相似的功能,并且在OptiX 5.1编程指南的第3章中概述了这些功能。

通过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);

答案 1 :(得分:0)

有两种使用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还有其他好处,例如变量的括号表示法。简而言之,为避免混淆,选择一个并坚持下去。