搭建 Optix 环境
我参考了 第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的混编代码,然后就好了!
惊不惊喜,意不意外!
附上文件配置路径:
- 包含目录

- 库目录

- 附加依赖项

代码:
- draw_color.cu文件
#include <optix.h>
#include <optixu/optixu_math_namespace.h>
using namespace optix; rtDeclareVariable(uint2, launch_index, rtLaunchIndex, );
rtBuffer<float4, > result_buffer; rtDeclareVariable(float3, draw_color, , ); RT_PROGRAM void draw_solid_color()
{
//result_buffer[launch_index] = make_float4(draw_color, 1.0f);
float2 degree = make_float2(launch_index)*3.14 / 180.0f;
result_buffer[launch_index] = make_float4(sin(degree.x), cos(degree.y), 0.0, .f);
}
- OptixFrame.h
#pragma once
#include <iostream>
#include <sstream>
#include <fstream>
#include <optix.h>
#include <nvrtc.h>
#include <optixu/optixpp_namespace.h>
#include <sutil.h>
#include <GL/glew.h>
#include "../Model/Texture.h" class OptixFrame
{
public:
OptixFrame();
~OptixFrame();
GLuint TransBuffer2Texture(GLfloat*);
GLuint getSrcTexId() {
return this->srcTexID;
} private:
int width = , height = ;
optix::Context context;
optix::Buffer outputBuffer;
GLuint srcTexID; private:
void setup();
void setColorSpace();
std::string ptxPath(const char* filename) { return std::string("./x64/Release/") + std::string(filename) + ".cu.ptx"; }
};
- OptixFrame.cpp
#include "./OptixFrame.h" OptixFrame::OptixFrame()
{
try
{
this->setup();
}
catch (const std::exception& e)
{
std::cerr << "Optix Error: " << e.what() << "\n";
}
} OptixFrame::~OptixFrame()
{
} void OptixFrame::setColorSpace() {
GLboolean use_SRGB = GL_FALSE;
glGetBooleanv(GL_FRAMEBUFFER_SRGB_CAPABLE_EXT, &use_SRGB);
if (use_SRGB) {
glEnable(GL_FRAMEBUFFER_SRGB_EXT);
}
} GLuint OptixFrame::TransBuffer2Texture(GLfloat* data) {
glGenTextures(, &this->srcTexID);
glBindTexture(GL_TEXTURE_2D, this->srcTexID);
glTexImage2D(GL_TEXTURE_2D, , GL_RGBA, this->width,this->height, , GL_RGBA, GL_FLOAT, data);
glGenerateMipmap(GL_TEXTURE_2D);
//Parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, );
return this->srcTexID;
} void OptixFrame::setup() {
context = optix::Context::create();
context->setRayTypeCount(); //1种光线(有时可以2种,渲染+阴影)
context->setEntryPointCount();
//申请Buffer
this->outputBuffer = context->createBuffer(RT_BUFFER_OUTPUT, RT_FORMAT_FLOAT4, width, height);
context["result_buffer"]->set(outputBuffer);
//编译Shader
//const char* ptx = sutil::getPtxString("Optix","draw_color.cu");
std::string ptx = this->ptxPath("draw_color");
//从ptx字串中标识 "draw_solid_color"入口函数,并创建并返回光线发生器模块
optix::Program ray_gen_program = context->createProgramFromPTXFile(ptx, "draw_solid_color");
context->setRayGenerationProgram(, ray_gen_program);
context["draw_color"]->setFloat(0.8f, 0.7f, 0.0f); context->setPrintEnabled(true); //可以配合tfPrintf()进行shader端打印
context->setPrintBufferSize(); //内部检查有效性
context->validate();
//开启第0个入口
context->launch(, width, height); this->setColorSpace();
GLfloat* imageData = (GLfloat*)outputBuffer->map(, RT_BUFFER_MAP_READ);
this->TransBuffer2Texture(imageData);
}
这些代码生成了OpenGL的texture2D纹理,然后就可以在OpenGL上显示了,OpenGL上的显示代码就不做展示了。
效果图:

搭建 Optix 环境的更多相关文章
- Flume1 初识Flume和虚拟机搭建Flume环境
前言: 工作中需要同步日志到hdfs,以前是找运维用rsync做同步,现在一般是用flume同步数据到hdfs.以前为了工作简单看个flume的一些东西,今天下午有时间自己利用虚拟机搭建了 ...
- 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展
上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...
- 搭建LNAMP环境(二)- 源码安装Nginx1.10
上一篇:搭建LNAMP环境(一)- 源码安装MySQL5.6 1.yum安装编译nginx需要的包 yum -y install pcre pcre-devel zlib zlib-devel ope ...
- 搭建LNAMP环境(一)- 源码安装MySQL5.6
1.yum安装编译mysql需要的包 yum -y install gcc-c++ make cmake bison-devel ncurses-devel perl 2.为mysql创建一个新的用户 ...
- Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1
交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...
- GJM : Unity3D HIAR -【 快速入门 】 二、搭建开发环境
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- Mac下maven工程的创建,并搭建SSH环境
最近项目有用到maven,就特地学了一下.maven的一句话攻略就是,项目托管.帮你解决各种项目琐事:清理,导包....等等. 首先先到apach官网去下载一个maven的包,http://maven ...
- maven实战(01)_搭建开发环境
一 下载maven 在maven官网上可下载maven:http://maven.apache.org/download.cgi 下载好后,解压.我的解压到了:D:\maven\apache-mave ...
- Sublime Text 2下搭建Python环境常见错误
Sublime Text 2下搭建Python环境时,最容易出的错误就是Python环境配置错误,导致build(Ctrl+B)后没有任何反应. 关于Python编程环境的配置,网上很容易搜索到.先默 ...
随机推荐
- webpack动态加载打包chunk命名
最近,遇到复杂h5页面开发,为了优化H5首屏加载速度,想到使用按需加载的方式,减少首次加载的JavaScript文件体积,于是将处理过程在这里记录一下,涉及到的主要是以下三点: 使用Webpack如何 ...
- Spring注解之@Component详细解析
@controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到sprin ...
- java---时间戳
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );// 格式化时间Date date = ne ...
- http请求报400错误的原因分析
在ajax请求后台数据时有时会报 HTTP 400 错误 - 请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里: 原因:1)前端提交数据的字段名称或者是字段类型 ...
- markdown简单使用
Markdown介绍: Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档.使用Markdown编写的文档可以导出为HTML.Word.图像.PDF等多种格式的文档. ...
- EXCEPTION_ACCESS_VIOLATION(0xc0000005)
EXCEPTION_ACCESS_VIOLATION(0xc0000005)eclipse.ini中添加:-XX:CompileCommand=exclude,org.eclipse.jdt.inte ...
- sqlplus登录时密码有特殊符号解决方法
偶然百度得到解决方法,在查看了公司有的脚本使用了这种解决方式,特记录下来,有需要的可以点击文末的链接查看原文. 本文转载https://www.cnblogs.com/lhrbest/p/656090 ...
- robotframework框架 - 在Pycharm当中编写RobotFramework测试用例
众所周知,pycharm是个写python极好用的编辑器.也可以装很多的插件来完成各种骚操作. 某一天,心血来潮在pycharm的插件库里,搜索了一下robot,恩,发现有支持robotframewo ...
- 解决安装tensorflow-gpu失败:Command "python setup.py egg_info"failed with error code 10 in.....
按照https://blog.csdn.net/shawroad88/article/details/82222811前几步安装. 又有新的报错如下: 再运行运行代码安装setuptools pip ...
- table+分页+模糊查询
这个分页超级棒嘞. 网页链接:http://www.cssmoban.com/cssthemes/7528.shtml