首页 > 解决方案 > OpenCL 和路径追踪材料系统

问题描述

我开始使用 GPU 使用 Opencl 开发自己的路径跟踪程序(为了速度)。我已经轻松地创建了具有标准属性(如金属、镜面反射、折射机会、发射等)的基本材料的路径跟踪器。

但我现在感兴趣的是创建更复杂材质的选项,例如在 Blender 的着色器图中您可以使用例如菲涅耳函数。

我认为这是每种材料的功能(如果这是可怕的方法,请阻止我)并且该功能返回有关射线着陆点的基本信息(基色,金属......)。它是某种对象材质的采样器。

这可以通过 CPU 上的 C++ 轻松完成。但是据我所知,OpenCL 不支持虚拟功能,并且为每种材质的功能创建大开关对 GPU 性能非常不利。

有没有人对材料系统有一些经验或者只是一些小技巧可以开始?我会感谢任何答案。

这是我的 C++ CPU 方法:

struct MaterialProp{
     float3 baseColor;
     float metallic;
     float specular;
     // ETC.
};

struct Material {
     virtual MaterialProp sampleMaterial(Ray ray, ... ){
           MaterialProp  prop;
           prop.baseColor = float3(0.0f, 0.0f, 0.0f);
           prop.metallic = 0.0f;
           prop.specular = 0.0f;
           ...
           prop;
     }
};


// Brand new material 
struct NewMaterial : public Material{

     Texture tex;

     virtual MaterialProp sampleMaterial(Ray ray, ... ){
           MaterialProp  prop;
           prop.baseColor = sampleTex(tex);
           prop.metallic = fresnel;
           prop.specular = 0.0f;
           ...
           prop;
     }
};


Color trace(Ray ray){

     Object* hitObj = intersectScene(ray);

     if(hitObj){
          MaterialProp prop = hitObj.Material.sampleMaterial(ray);

          //Do other stuff with properties;
          //return color;
     }else{
          return Color(0.0f, 0.0f, 0.0f);
     }

};

标签: gpurenderingopencl

解决方案


推荐阅读