我参考了 第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. 关于c#winform用sharpGL(OpenGL)绘制不出图形,绘制窗口是个黑框的坑

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11790309.html 在c++的opengl中可能是因为是最基本的库,很多东西都把你做好了 ...

  2. Java 基础复习 基础数据类型与包装器类型

    Java 基础 基础数据类型与包装器类型 基础数据类型 java 中包含哪些基础数据类型,默认值分别是多少? 基础数据类型 byte short int long double float char ...

  3. SQL server 安装成功到使用Sa SQL server验证登录等一系列问题

    使用 Windows 身份验证方式登录 出现错误 无法连接到 本地服务器 解决问题: SQL server配置管理器:服务远程过程调用失败 https://blog.csdn.net/gfjjggg/ ...

  4. U盘启动安装系统之旅----记录自己的第一次操作

    网上也有很多装系统的教程,这篇主要是对自己第一次装系统的一个记录,很惭愧,现在才尝试第一次用U盘启动装系统.经常有人说,系统都不会装,就别说搞这行的.当你会了,你就会觉得其实它真的是一件很简单的事情. ...

  5. synchronized到底锁住的是谁?

    本文代码仓库:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sync 先来一道校招级并发编程笔试题 题 ...

  6. 1、netty入门说明

    netty中的例子,基本模式都是:server -> Initializer -> Handler . 在server中去启动线程,打开端口,设置initializer,和一些启动的参数配 ...

  7. MySQL删除大表时潜在的问题(drop table,truncate table)

    来源于:https://www.cnblogs.com/CtripDBA/p/11465315.html,侵删,纯截图,避免吸引流量之嫌 case1,删除大表时,因为清理自适应hash索引占用的内容导 ...

  8. MySQL数据库:函数的应用

    字符串截取 # 从左边开始 第1个字符 left(字段名,1) # 从那里开始,截取几个 substring(字段名,1,1) str函数 # 连接字符串 concat(s1,s2,s3,--,sn) ...

  9. [Go] 实现面向对象中的继承和覆盖方法

    go中的继承是使用结构体嵌套实现的,可以继承父类的方法 覆盖和其他面向对象的语言是一样的,函数名,参数,返回类型一致,就可以覆盖父类的方法 package main import "log& ...

  10. Java之Arrays类

    Arrays概述 java.util.Arrays 此类包含用来操作数组的各种方法,比如排序和搜索等.其所有方法均为静态方法,调用起来非常简单. 常用方法 public static String t ...