gpu - 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);
}
};
解决方案
推荐阅读
- java - 使用 C# SOAP 序列化程序的 RSA 两因素身份验证
- java - TaskRejectedException 抛出和线程池未满
- google-apps-script - 类似的 OnEdit 和 OnEdit2 脚本不能一起工作
- python - 如何使用 matplotlib 更改 xticks?
- scala - 如何将空格分隔文件转换为 Scalar spark 中的 CSV 文件?
- r - 3个条件在R中的if语句中是不可接受的
- mysql - 如何根据主表的字段值加入 2 个不同的表?
- python - 我不知道为什么我不能在我的代码上编辑我的数组
- symfony - 这是否可以使用 API 平台与 Heroku 获得 Mercure 协议?
- c# - 在 WPF C# 应用程序中,列表框绑定源目录包含“#”,但应用程序无法加载它