2013-04-28 67 views
0

在这个代码头脑文章http://www.codermind.com/articles/Raytracer-in-C++-Depth-of-field-Fresnel-blobs.html中,关于反射/折射的部分有几个它检查是否传输或反射光线的情况。对于射线追踪折射/反射,不应该透射率+反射率= 1?

它说,在范围0到rand_num 1:

if(rand_num<=reflectance){ 
    //reflect a ray 
}else if(rand_num<=reflectance+transmittance){ 
    //transmit a ray through surface 
}else{ 
    //diffuse calculation 
} 

我是反射率+透射率= 1的印象,让else语句会usesless。如果不是1反射率,透射率应该是多少?

+0

入射光有四种情况发生:1)定向反射2)漫反射3)吸收4)透射率 – CodesInChaos 2013-04-28 18:52:26

+0

所以我会设想方向反射将是反射= 1.0f和透射= 0.0f的情况。那么透射率将是透射率= 1.0f和反射率= 0.0f的情况。那么另外两种情况是什么? – 2013-04-28 18:57:53

+0

到codermind的链接不再有效。我不知道发生了什么事。 – 2015-11-29 19:45:01

回答

0

它基本上是给在代码中的注释的答案:

的光线得到透射,反射或漫反射。在物理上,后两者是相同的,但在光线追踪中,两者的处理方式不同。

第一个产生像镜子一样的高光和实际反射,而漫反射部分对于像橡胶那样与镜子非常不同的表面非常重要。

+0

我相信。我的问题是,如果rand_num的范围是0到1,并总是反映+ transmit = 1,那么这个else语句将永远不会被调用。 Rand_num必须小于或等于反映+传输。 – 2013-04-28 18:54:19

+0

“反射”在这里专指镜面反射(镜像)。 – 2013-04-28 19:02:49

+0

所以当你说反射率时,你是指表面的brdf系数。就像有人会说任何反射光线需要乘以这个“反射”常数。但这与计算菲涅耳方程的反射率有什么不同? – 2013-04-28 19:08:20

1

在这种简单的模型中,有这种情况发生于入射光四两件事:1)定向反射2)扩散反射3)吸收4)透射率

少数(理想化的)例子:

  • 魔镜:只有定向反射
  • 白:仅漫反射
  • 黑色:只吸收
  • 防反射玻璃:只有透过率

通过将三个系数的总和设置为小于1的值来隐式处理吸收。

实际上还有一些额外的效果,如只反射只在理想方向上进行,平均偏差取决于材料,自身发光的材料,有方向性或改变颜色的不寻常反射效果。