【问题标题】:C++ raytracer bugC++ 光线追踪器错误
【发布时间】:2018-06-21 07:34:01
【问题描述】:

我用 C++ 编写了一个光线追踪器。这是计算漫反射分量的sn-p:

//diffuse component
    color diffuse(0, 0, 0);
    if (intrs.mat.diffuseness > 0)
    {
        for (auto &light : lights)
        {
            //define ray from hit object to light
            ray light_dir(intrs.point, (light->point - intrs.point).normalize());
            double nl = light_dir.direction*intrs.normal; //dot product
            double diminish_coeff = 1.0;
            double dist = intrs.point.sqrDistance(light->point);
            //check whether it reaches the light
            if (nl > 0)
            {
                for (int i = 0; i < (int)shapes.size(); ++i)
                {
                    shape::intersection temp_intrs(shapes[i]->intersect(light_dir, shapes[i]->interpolate_normals));
                    if (temp_intrs.valid && temp_intrs.point.sqrDistance(intrs.point) < dist)
                    {
                        diminish_coeff *= shadow_darkness;
                        break;
                    }
                }
            }
            diffuse += intrs.mat.diffuseness * intrs.mat.col * light->light_color * light->light_intensity * nl*diminish_coeff;
        }
    }

当然,我不能发布整个代码,但我认为应该清楚我在这里做什么——intrs 是射线和物体的当前交集,shapes 是所有的向量场景中的物体。

颜色表示为 (0,1) 范围内的 RGB。颜色的加法和乘法是简单的成员加法和乘法。仅当光线跟踪结束并且我想写入图像文件时,我将颜色乘以 255,如果组件大于该值,则将其钳制为 255。

目前,场景中有一个点光源,它是白色的:color(1,1,1),intensity = 1.0。

这是我的渲染图像:

所以,这是不对的——左边的橱柜应该是绿色的,而盒子应该是红色的。

我的实现是否有明显问题?我似乎无法弄清楚。如有必要,我会发布更多代码。

【问题讨论】:

  • 我可能说错了,nl 不应该是点积吗?
  • @rak007 是点积。 :) 我会在我的问题中指出这一点。
  • 在同一张纸条上,您能否添加更多关于您的 colorclass 如何实现 += 重载的说明?
  • 1.场景中有多少盏灯? 2.diffuse +=表达式中的所有因子都是&lt;= 1.?
  • @Eutherpy 请edit 进入问题,这是至关重要的信息。

标签: c++ graphics raytracing


【解决方案1】:

看来您的diffuse += 行应该在if (nl &gt; 0) 条件之内,而不是在它之外。

【讨论】:

    【解决方案2】:

    我发现了问题。出于某种原因,我的 intrs.normal 向量没有被标准化。感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2018-05-31
      • 2015-02-05
      相关资源
      最近更新 更多