搭建 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编程环境的配置,网上很容易搜索到.先默 ...
随机推荐
- Spring Boot 异常处理静止trace
概述 在spring boot 2.2 中 默认状态为status 999 private void addStatus(Map<String, Object> errorAttribut ...
- Jmeter中使用HTTP信息头管理器发送json格式请求体的接口
Jmeter中,如果请求体的格式为x-www-form-urlencoded,则不需要添加请求头,保持默认即可,但是如果遇到接口的请求体格式为json时,就要用到HTTP信息头管理器,在线程组上右键— ...
- 深度好文:PHP写时拷贝与垃圾回收机制(转)
原文地址:http://www.php100.com/9/20/87255.html 写入拷贝(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略.其核心思想是,如果有多个调用 ...
- Refresh design pattern
多年后, 再次翻阅设计模式书籍, 将每种模式的要点总结于此, 需要本身有一定设计模式基础, 再结合要点, 帮助更好理解与运用. 策略模式 (Strategy) 附加功能单独抽象不同接口 功能以组合方式 ...
- 比特币原理——交易与UTXO
UTXO UTXO (Unspent Transaction Output) 未花费交易输出 传统的支付系统都是基于账户(account based)的,即: 若A向B转账20元 判断A的账户余额大于 ...
- Android Studio的安装及第一次启动时的配置
Android Studio的安装及第一次启动时的配置 一.下载Android Studio 百度搜索“Android Studio" 点击中文社区进入,选择最新版本下载. 下载后双击安装包 ...
- MATLAB实例:绘制折线图
MATLAB实例:绘制折线图 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 条形图的绘制见:MATLAB实例:绘制条形图 用MATLAB将几组不同的数 ...
- 2019-2020-1 20199305《Linux内核原理与分析》第十二周作业
缓冲区溢出漏洞实验 (一)何为缓冲区溢出漏洞 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于 ...
- 【linux命令】chgrp改变文件或目录的属组
在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...
- (五十七)c#Winform自定义控件-传送带(工业)-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...