【问题标题】:Getting absurd reflections on a sphere in Raytracing在光线跟踪中获得球体上的荒谬反射
【发布时间】:2019-10-07 20:54:17
【问题描述】:

我正在尝试在 C++ 中实现一个简单的基于 CPU 的 Raytracer。 但是在场景中实现反射时,我得到了一些荒谬的结果,反射并没有覆盖我试图反射的整个对象。我已附上图片以供参考。

这是我正在使用的反射算法。

//reflected ray
                  Vec3 ref =(dir - 2*((dir.dot(Normal))*Normal)).normalized();
                  Vec3 reflect_orig;

                  if(depth < MAX_DEPTH && figurelist[figureHit]->reflectness>0.0f ){
                      if(ref.dot(Normal)<0.0f){

                          reflect_orig = p0 - (Normal*0.001f);

                      }
                      else{
                          reflect_orig = p0 + (Normal*1e-3f);
                      }
                      reflectcolour = reflectcolour+ray_trace(reflect_orig,ref,depth+1);
                      return Pixelcolour = reflectcolour;
                  }
                  else{
                     Pixelcolour = diffuse+specular;
                  }

其中“dir”是光线的方向。

【问题讨论】:

    标签: c++ graphics 3d raytracing


    【解决方案1】:

    图片看起来还不错。当我尝试在我的GLSL ray tracer 中重新创建你的场景时,我得到了这个结果:

    如您所见,除了不同的照明,它并没有太大的不同。我只猜到了位置、大小、颜色、反射和折射系数,所以我的场景和你的不完全一样:

    ray.beg();
    //                 r   g   b rfl rfr   n                               x     y     z   rx   ry   rz
    ray.add_material(0.8,0.8,0.6,0.0,0.0,_n_glass); ray.add_box       (  0.0,  0.0,-10.0,10.0,10.0, 0.1);
    ray.add_material(0.8,0.8,0.6,0.0,0.0,_n_glass); ray.add_box       (  0.0,  0.0,+10.0,10.0,10.0, 0.1);
    ray.add_material(1.0,0.1,0.1,0.0,0.0,_n_glass); ray.add_box       (-10.0,  0.0,  0.0, 0.1,10.0,10.0);
    ray.add_material(0.1,1.0,0.1,0.0,0.0,_n_glass); ray.add_box       (+10.0,  0.0,  0.0, 0.1,10.0,10.0);
    ray.add_material(0.8,0.6,0.8,0.0,0.0,_n_glass); ray.add_box       (  0.0,-10.0,  0.0,10.0, 0.1,10.0);
    ray.add_material(0.8,0.6,0.8,0.0,0.0,_n_glass); ray.add_box       (  0.0,+10.0,  0.0,10.0, 0.1,10.0);
    //                 r   g   b rfl rfr   n                               x     y     z   r
    ray.add_material(0.7,0.0,0.0,0.0,0.0,_n_glass); ray.add_sphere    (+ 1.5,- 1.5,+ 0.5,1.5);
    ray.add_material(0.0,0.0,0.7,0.8,0.0,_n_glass); ray.add_sphere    (- 1.5,+ 1.5,- 0.5,1.5);
    ray.end();
    

    我使用这些索引:

    const GLfloat _n_glass=1.561;
    const GLfloat _n_vacuum=1.0;
    

    蓝色球体边缘的失真(不存在反射)可能是由于您使用了doubles 的低精度造成的?我不知道您使用的是什么库,但Vec3 通常意味着只有浮动尝试dVec3 或其他任何...问题可能与此有关:

    在纯floats 上往往会导致类似的伪影,甚至在反射/折射球体的边缘上也会出现噪音。这是我的同一个引擎,但在floats:

    如您所见,噪音更多地出现在您的输出完全没有反映的区域,表明类似的原因...

    但是,我在您的图像中看到一些 纵横比失真,就像您期望的方形窗口和 640x480 矩形一样,因此您没有或反纵横比校正。这可能会稍微弄乱投射的光线方向,并在反射/折射后进一步扭曲图像......

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多