我参考了 第0个示例 OptixHello 学习Optix的工程配置以及基本框架 的配置过程,该文对于 Optix 的框架介绍的很好,但是按照该文配置遇到了一些问题,我花费了一番功夫自己摸索终于配置好了环境,实现了用Optix计算然后在OpenGL上展示结果的一个简单的Demo。
我的配置环境为:Win10,GTX1080,驱动版本431.6,Cuda9.0,Optix6.0,VS2015
Cuda我很早就安装了,很简单,这里就不做介绍了。
1、下载Optix6.0
地址:https://developer.nvidia.com/designworks/optix/downloads/legacy
GTX1080应该是只能支持到6.0版本。我刚开始下载了6.5版本,然后顺利使用Cmake打包、VS编译,将Optix引擎库引入VS工程后,运行 optix::Context::create(); 都会报错 “缺失Optix Library”!!!
查阅文档后发现可能是驱动的问题:
Optix6.5需要435以上的驱动,我更新了我的驱动后只能到431.6,所以只能下载Optix6.0,Optix6.0需要418以上的驱动,好极了!我的驱动合适 ^_^
至此,optix::Context::create()是可以运行了。
2、设置VS生成ptx
我们可以在.cu文件中写 Optix 的 shader 代码,这个代码运行在GPU端,需要使用nvcc编译(cuda),但是编译完不会保留中间汇编文件.ptx,而 Optix 需要使用这个 .ptx 文件生成“光线发生器模块”。
换句话说,Optix得使用一个.ptx格式的 shader 进行GPU端的计算。那么我们必须在VS中进行相关设置,保留.ptx中间文件。
两种方式:
- cuda命令行中设置,加入 --keep ,保留所有的中间结果
- cuda的common属性配置中设置
然后就可以获取ptx生成“光线发生器模块”了
std::string ptxPath(const char* filename) { return std::string("./x64/Release/") + std::string(filename) + ".cu.ptx"; } optix::Program ray_gen_program = context->createProgramFromPTXFile(ptx, "draw_solid_color");
这里除了从ptx文件生成program,还可以从ptx字符串生成program
context->createProgramFromPTXString("……", "draw_solid_color");
3、设置.cu编译方式
我写了一个简单的程序,编译就报错,.cu文件编译出错
我想到可能是编译方式的问题。我最开始设置的混编,因为cuda程序需要混编。
我查了资料,有人说可以混编,可是我觉得可能是混编的问题,所以修改为了只编译GPU端代码,但是!!! 我之前写过cuda混编的代码,工程中含有cuda混编的代码,不能直接修改编译方式,修改了直接报错。
如果剔除之前cuda的混编代码还有点麻烦,想了想既然有人说可以混编,那我就不改编译方式了,结果。。。。。。 ,一晚上查了各种资料找不到问题所在。。。。。。
已经晚上11多了,一个师兄还在实验室,我过去请教了一把,师兄看到我设置的混编,告诉我不能设置为混编,他从一开始就设置的Generate .ptx file(-ptx),但是言语之间仿佛师兄也没有设置过混编,不知道行不行。我试着改为编译GPU端-ptx方式,然后剔除了cuda的混编代码,然后就好了!
惊不惊喜,意不意外!
附上文件配置路径:
- 包含目录
- 库目录
- 附加依赖项
效果图: