0

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

  1. 找到命中点(交点)(下面的h)
  2. 从该点生成另一条射线
  3. 使用新生成点的颜色

通过关注,您还可以找到该部分的代码,但我不明白为什么我会为新生成的光线(上面的第 3 部分)得到黑色(.0f,.0f,0.f)。

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应该包含一些颜色。我已经提到了反射和反射颜色来帮助你更好地理解这个过程。你可以简单地忽略它们。

4

1 回答 1

1

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

  1. 通过移除反射光线的任何贡献来隔离折射光线的贡献。
  2. 确保你有一个错过的节目。HitPRD::attenuation 需要被所有最接近的命中程序和未命中程序写入。如果您怀疑错过的程序被调用,请将您的错过颜色设置为明显不好的颜色([1,0,1] 是我最喜欢的)。
  3. 将 rtPrintf 与 rtContextSetPrintLaunchIndex 或 setPrintLaunchIndex 结合使用以打印出产品的各个值,以查看给定像素中哪个项为零。如果您不将输出限制为给定的启动索引,您将获得过多的输出。您可能还想打印出深度。
于 2013-01-23T18:50:56.647 回答