这个问题旨在帮助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代码,并尝试维护已经设计好的代码样式和对象用法...我该如何解决呢?
答案 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还有其他好处,例如变量的括号表示法。简而言之,为避免混淆,选择一个并坚持下去。