zoukankan      html  css  js  c++  java
  • 搭建 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() << "
    ";
        }
    }
    
    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上的显示代码就不做展示了。

      

      效果图:

      

      

      

      

  • 相关阅读:
    POJ 3281 /// 最大流
    POJ Evacuation /// 二分图最大匹配
    POJ 3041 /// 二分图匹配
    Codeforces Round #526 D
    Codeforces Round #526 C
    2018ICPC焦作 F. Honeycomb /// BFS
    2018ICPC焦作 D-Keiichi Tsuchiya the Drift King /// 几何
    Codeforces Round #525 E
    哈理工赛 H-小乐乐学数学 /// 筛法得素数表+树状数组
    Codeforces Round #525 D
  • 原文地址:https://www.cnblogs.com/chen9510/p/11737941.html
Copyright © 2011-2022 走看看