搭建 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, 2> 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, 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 = 800, height = 800;
    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(1, &this->srcTexID);
    glBindTexture(GL_TEXTURE_2D, this->srcTexID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->width,this->height, 0, 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, 0);
    return this->srcTexID;
}

void OptixFrame::setup() {
    context = optix::Context::create();
    context->setRayTypeCount(1); //1种光线(有时可以2种,渲染+阴影)
    context->setEntryPointCount(1);
    //申请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(0, ray_gen_program);
    context["draw_color"]->setFloat(0.8f, 0.7f, 0.0f);

    context->setPrintEnabled(true); //可以配合tfPrintf()进行shader端打印
    context->setPrintBufferSize(4096);

    //内部检查有效性
    context->validate();
    //开启第0个入口
    context->launch(0, width, height);

    this->setColorSpace();
    GLfloat* imageData = (GLfloat*)outputBuffer->map(0, RT_BUFFER_MAP_READ);
    this->TransBuffer2Texture(imageData);
}

  这些代码生成了OpenGL的texture2D纹理,然后就可以在OpenGL上显示了,OpenGL上的显示代码就不做展示了。

  

  效果图:

  

  

  

  

原文地址:https://www.cnblogs.com/chen9510/p/11737941.html

时间: 2024-11-16 12:42:46

搭建 Optix 环境的相关文章

Mac OSX (EI Capitan)搭建Caffe环境并配置python接口

Caffe是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清.Caffe是纯粹的C++/CUDA架构,支持命令行.Python和MATLAB接口:可以在CPU和GPU直接无缝切换.我在MacbookPro(无NVIDIA显卡)上大费周章地配置了Caffe的环境,并花了许多时间配置其python接口. 一.下载Caffe github上的下载地址:https://github.com/BVLC/caffe进入到下载后的路径,并复制 Makefile.config.ex

搭建lnmp环境,部署php动态网站

搭建LNMP 前言:"N"代表Nginx与apache的作用一样,都是为了搭建网站服务器,由俄罗斯人lgor sysoev开发,其特点是占有内存少,并发能力强,单台物理服务器可支持3万-5万个并发请求,中国使用nginx网站用户有:百度.京东.新浪.网易.腾讯.淘宝等. 通过下面的实验搭建LNMP环境,部署天空影城的php动态网站 本实验在虚拟机中运行,使用Redhat6.5系统部署! 一.安装及运行 1.搭建yum仓库,安装支持软件 nginx的配置及运行需要pcre,zlib等软件

搭建 LNMP 环境

搭建 LAMP 环境 一.环境介绍 二.必装依赖软件 三.编译安装 Nginx-1.6.3 四.二进制安装 MYSQL-5.5.33 五.编译安装 PHP-5.3.27 六.检测 nginx与mysql nginx与php 是否相连 七.安装 wordpress (分别基于IP,域名访问) 一.环境介绍 搭建这个环境,所有服务都安装在一台虚拟机中,在此介绍一下我的虚拟机 CentOS-6.7-x86_64    保证虚拟机可以正常上网 IP:192.168.6.36 hostname:yuci

ubuntu16.04搭建opencv3环境

为了搭建opencv3,看了各种教程,装了卸,卸了装,多次失败后,在几篇文档的借鉴下,终于是成功搭建了环境. 首先,更新ubuntu上的一些库: sudo apt-get update sudo apt-get upgrade 其次,需要安装一些搭建opencv3的库(要在opencv3搭建前安装好) 具体需要的库如下: sudo apt-get install cmakesudo apt-get install build-essential libgtk2.0-dev libavcodec-

?搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机

本节所讲内容: 实战:搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机 LAMP架构:??? Linux+Apache+Mysql+PHP Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,共同组成了一个强大的Web应用程序平台. 一.安装需要的软件包 [[email protected] ~]# yum install httpd mysql-server mysql php php-mysql  -y ht

GNS3结合VMWORE搭建虚拟化环境的好处

GNS3结合VMWORE搭建虚拟化环境的好处 在对虚拟化进行学习和测试时,光使用VMWORE就能搭建虚拟化的测试环境.那为何还要使用GNS3模拟器呢!使用GNS3结合VMWORE的好处如下图所示: 如上图所示,假设不使用GNS3模拟的交换机时,EXSI主机之间是不能通信的,因为EXSI主机连到了不同的虚拟网络.如果要让它们之间能通信的话,使用GNS3就是一种很好的办法.总之GNS3结合VMWORE搭建虚拟化环境的好处有如下两点: GNS3能够互连不同的虚拟网络,增加实验灵活性. GNS3使得环境

使用eclipse+tomcat搭建本地环境

项目开发工具很多,这里简单介绍下使用eclipse+tomcat如何搭建本地环境. 安装开发工具如下: 1. jdk的安装参考 下载地址:http://pan.baidu.com/s/1sj9rVYX 安装参考地址:http://www.cnblogs.com/pxue/archive/2011/05/10/2042530.html 如果cmd中javac运行不了,尝试将环境变量中的path的%JAVA_HOME%路径设置为绝对路径 关键点:(设置三个环境变量) JAVA_HOME      

Netbeans搭建Android环境

原文:Netbeans搭建Android环境 Netbeans环境的搭建主要依赖于NBAndroid插件,项目地址: http://www.nbandroid.org/p/installation.html 开发机器:Windows 7 IDE:Netbeans 7.3 第一步:安装插件 启动Netbeans,在工具——插件——设置面板点击“添加”,如下图所示: 输入一个名称,URL填写:http://nbandroid.org/release72/updates/updates.xml 如果你

Linux程序设计(搭建开发环境--curses)

看官们,咱们今天要说的内容,是前面内容的一点小补充,具体的内容是:安装curses开发包,以搭建 开发环境.闲话休说,言归正转. 我们在前面说过搭建开发环境的内容,主要说了开发环境中的GCC和VIM,今天咱们会说如何搭建开发环境 中的另外一个工具:curses. curses是Linux上的一个图形库,不过我们使用的Mint只安装了库文件,没有安装与该库相关的头文件.没 有这些头文件,就不能进行相关的开发工作.因此,如果我们想使用Linux开发一些简单的图形软件的话,就 需要安装与该相关的头文件