我参考了 第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 环境的更多相关文章

  1. Flume1 初识Flume和虚拟机搭建Flume环境

    前言:       工作中需要同步日志到hdfs,以前是找运维用rsync做同步,现在一般是用flume同步数据到hdfs.以前为了工作简单看个flume的一些东西,今天下午有时间自己利用虚拟机搭建了 ...

  2. 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展

    上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...

  3. 搭建LNAMP环境(二)- 源码安装Nginx1.10

    上一篇:搭建LNAMP环境(一)- 源码安装MySQL5.6 1.yum安装编译nginx需要的包 yum -y install pcre pcre-devel zlib zlib-devel ope ...

  4. 搭建LNAMP环境(一)- 源码安装MySQL5.6

    1.yum安装编译mysql需要的包 yum -y install gcc-c++ make cmake bison-devel ncurses-devel perl 2.为mysql创建一个新的用户 ...

  5. Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1

    交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...

  6. GJM : Unity3D HIAR -【 快速入门 】 二、搭建开发环境

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  7. Mac下maven工程的创建,并搭建SSH环境

    最近项目有用到maven,就特地学了一下.maven的一句话攻略就是,项目托管.帮你解决各种项目琐事:清理,导包....等等. 首先先到apach官网去下载一个maven的包,http://maven ...

  8. maven实战(01)_搭建开发环境

    一 下载maven 在maven官网上可下载maven:http://maven.apache.org/download.cgi 下载好后,解压.我的解压到了:D:\maven\apache-mave ...

  9. Sublime Text 2下搭建Python环境常见错误

    Sublime Text 2下搭建Python环境时,最容易出的错误就是Python环境配置错误,导致build(Ctrl+B)后没有任何反应. 关于Python编程环境的配置,网上很容易搜索到.先默 ...

随机推荐

  1. 使用redisson时关于订阅数的问题

    在使用redisson消息订阅时,我针对门店商品库存减扣进行订阅的操作(在这里一个商品一个监听队列),当正式投入生产时,发现一直再报Subscribe timeout: (" + timeo ...

  2. django-channels的部署(supervisor+daphne+nginx)

    项目中需要一个聊天室的功能,所以需要websocket通信,选择了使用channels模块,主要记录下channels部署的配置和一些坑. 原项目是通过nginx+uwsgi部署的,这里我没做任何改动 ...

  3. 从0系统学Android--3.2四种基本布局

    从0系统学Android--3.2四种基本布局 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.3 系统控件不够用?创建自定义控件 上一节我们学习了 Android 中的一些常用的控件 ...

  4. Linux(Centos7)下redis5安装、部署、开机自启

    1.什么是redis redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止redis支持的键值数据类型如下字符串 ...

  5. Codeforces 547C/548E - Mike and Foam 题解

    目录 Codeforces 547C/548E - Mike and Foam 题解 前置芝士 - 容斥原理 题意 想法(口胡) 做法 程序 感谢 Codeforces 547C/548E - Mik ...

  6. 通过BGP实现流量劫持

    BGP BGP全称是Border Gateway Protocol,翻译成中文是边界网关协议,用于全球各个AS之间的路由.它的地位是毋庸置疑的,如果没有它就没有全球的因特网.因为全球各个AS都等价的维 ...

  7. vscode 启动

    code --user-data-dir /root/vscode code --user-data-dir /root/vscode

  8. 创建可执行的JAR包并运行

    将一个应用程序制作成可执行的JAR包,通过JAR包来发布应用程序.创建可执行JAR包的关键在于:让java -jar命令知道JAR包中哪个类是主类,java -jar命令可以通过运行该主类来运行程序. ...

  9. Java基础(六)

    Spring依赖注入的几种方式 1.接口注入 2.setter方法注入 3.构造方法注入 Struts2的拦截器与过滤器的工作原理 1.Structs2拦截器是在访问某个Action或Action的某 ...

  10. SpringCloud微服务(03):Hystrix组件,实现服务熔断

    本文源码:GitHub·点这里 || GitEE·点这里 写在前面:阅读本文前,你可能需要熟悉一下内容. 微服务组件:Eureka管理注册中心 微服务组件:Ribbon和Feign服务调用 Sprin ...