2013-05-09 47 views
6

我正在用C++编写光线跟踪器,并且我一直在使用折射问题。我渲染一个球体和一个地平面,球体应该折射。然而,它看起来更像是一个球体内的球体:“外部”球体看起来被适当地遮蔽,但不会折射,而“内部”球体看起来像是自我阴影。下面是它的外观链接:http://imgur.com/QVGkeBTRaytracer折射Bug

下面是相关的代码。

//inside main raytrace function 
    if(refraction > 0.0f){ //the surface is refractive 
     //calculate refraction vector 
     Ray refract(intersection, 
      objList[bestObj]->refractedRay(
      ray.dir,intersection,&cos_theta,&R0)); 
     //recurse 
     refrColor = raytrace(refract); 
     } 
     else{ //no refraction 
     refrColor = background; 
     } 


//refractedRay(vec3,vec3,float*,float*) 
    //...initialize variables, do geometric transforms 
    //into air out of obj 
    if(dot(ray,normal) < 0){ 
    n1 = ior; 
    n2 = 1.0f; 
    *cos = dot(ray,-normal); 
    } 
    //into obj out of air 
    else{ 
    n1 = 1.0f; 
    n2 = ior; 
    *cos = dot(ray,normal); 
    normal = -normal; 
    } 

    //check value under sqrt 
    float n = n1/n2; 
    float disc = 1-(pow(n,2)*(1-pow(*cos,2))); 
    if(disc < 0){ //total internal reflection 
    return ray - 2*-(*cos)*normal; //reflection vector 
    } 

    return (n*ray)+(((n*(*cos))-sqrt(disc))*normal); 

该领域用来看起来更糟,然后我记得正常化我的载体,它看起来像这样。以前,它看起来只有整个内部的球体。在主光线跟踪功能中,我使用与反射相同的方式进行折射,只是使用折射光线。我也试着用epsilon修改交叉点和射线的入射点,以检查自身折射,因为您可以获得阴影。

任何帮助,将不胜感激:)

+0

请问您纠正后请给出正确答案吗? 谢谢 – 2013-10-24 16:50:07

回答

3

我没有检查你的折射公式,但是这看起来错误:

//into air out of obj 
if(dot(ray,normal) < 0){ 
    n1 = ior; 
    n2 = 1.0f; 
    *cos = dot(ray,-normal); 
} 

如果入射光线的点积和正常小于零,并假设对象外的正常点(它可能应该),那么这种情况对应于air -> inside,所以你的折射率应该交换。因为现在你正在渲染一个球体,并且由于折射率小于1,所以你正在观察边缘的全内反射。

Here is one of my implementations你可以看看是否缺少任何东西(它有更多的功能,但你应该能够识别你感兴趣的部分,并检查它的计算匹配)。对我来说它看起来很好,所以我认为固定折射率应该这样做。但是,球体中心的不确定性模式看起来像自交。确保在反射的情况下,您稍微在相交表面的外侧推动反射光线,并且在折射的情况下,稍微推入折射光线以避免自相交。

+0

我改变了if/else块内的值,但由于某种原因,我从未想过将它们从一个移动到另一个会起作用!我猜我的数学知识有点偏离。谢谢你,你救了我更多的斗争时间:) – 2013-05-10 00:53:22

+0

@BhargavB不客气!祝你的光线追踪器,这是一个非常有趣的经验,写一个:) – Thomas 2013-05-10 01:11:17

+0

@Thomas我有类似的问题,我想你可以回答我,你可以请看看。 http://stackoverflow.com/questions/19548384/refraction-vector-ray-tracing?noredirect=1#comment29006102_19548384 – 2013-10-24 17:14:26