cuda中渐进式光子映射的透明度

时间:2013-01-22 15:19:14

标签: graphics cuda nvidia graphic optix

我正在开发一个基于optix的项目。我需要使用渐进式光子映射,因此我尝试使用样本中的渐进式光子映射,但未实现透明度材料。 我搜索了很多,并试图了解其他包含透明材料的样本(例如Glass,Tutorial,whitted)。最后,我得到了如下解决方案;

  1. 找到生命点(交叉点)(下方h)
  2. 从该点生成另一条光线
  3. 使用新生成点的颜色
  4. 通过以下你也可以找到该部分的代码,我不明白为什么我得到新生成的光线的黑色(.0f,.0f,0.f)(上面的第3部分)。

    optix::Ray ray( h, t, rtpass_ray_type, scene_epsilon );
    HitPRD refr_prd;
    refr_prd.ray_depth = hit_prd.ray_depth+1;
    refr_prd.importance = importance;
    
    rtTrace( top_object, ray, refr_prd );
    
    result += (1.0f - reflection) * refraction_color * refr_prd.attenuation;
    

    任何想法都将受到赞赏。 请注意,使用函数rtTrace()后, refr_prd.attenuation 应包含一些颜色。我已经提到了反射和reflaction_color来帮助你更好地理解这个过程。你可以简单地忽略它们。

1 个答案:

答案 0 :(得分:1)

有许多方法可以诊断您的问题。

  1. 通过去除反射光线的任何贡献来隔离折射光线的贡献。
  2. 确保您有错过的计划。 HitPRD ::衰减需要由所有最近的命中程序和未命中程序写入。如果您怀疑正在调用未命中程序,请将您的错过颜色设置为明显不好的颜色([1,0,1]是我的最爱)。
  3. 将rtPrintf与rtContextSetPrintLaunchIndex或setPrintLaunchIndex结合使用,打印出产品的各个值,以查看给定像素中哪个项为零。如果不将输出限制为给定的启动索引,则会产生过多的输出。你可能也想打印出深度。