【问题标题】:Getting diffuse material right form cpu code to gpu shader从 cpu 代码到 gpu 着色器获取正确的漫反射材质
【发布时间】:2020-01-26 22:07:44
【问题描述】:

我正在尝试从raytracing in one weekend 解开此函数

vec3 color(const ray& r, hitable *world)
{
   hit_record rec;
   if(world->hit(r,0.0, MAXFLOAT, rec)){
      vec3 target = rec.p + rec.normal + random_in_unit_sphere();
      return 0.5*color( ray(rec.p, target-rec.p), world);
   }
   else{
      vec3 unit_direction = unit_vector(r.direction());
      float t = 0.5*(unit_direction.y() + 1.0);
      return (1.0-t)*vec3(1.0,1.0,1.0) + t*vec3(0.5,0.7,1.0);
   }
}

我知道它会发送一条射线并反弹它直到它没有击中任何东西。
所以我试图在 GLSL 着色器中解开这个递归函数。

vec3 color(ray r, hitableList list)
{
    hitRecord rec;
    vec3 unitDirection;
    float t;
    while(hit(r, 0.0, FLT_MAX, rec, list))
    {
        vec3 target = rec.p + rec.normal;
        r = ray(rec.p, target-rec.p);
    }
    unitDirection = normalize(direction(r));
    t = 0.5* (unitDirection.y + 1.);
    return (1.-t)*vec3(1.)+t*vec3(0.5,0.7,1.);
}

通常它应该输出这样的漫反射:

但我只得到这样的反光材料:

请注意,该材质具有高度反射性,可以反射场景中的其他球体。
我查看了代码,有些东西告诉我这是我对 tail recursive fonction 的错误做法。
另外我不返回 0.5 * return 0.5 * color(...) 我不知道该怎么做。

更新

感谢 Jarod42 的遮阳篷,现在实现了 0.5 * 因子,这解决了材料没有“正确”曝光的问题。
但是现在仍然没有生成漫反射材质,我最终得到了一个完全反射的金属材质。

【问题讨论】:

  • target-rec.p 可以简化为rec.normal /* + random_in_unit_sphere() */。顺便说一句,随机部分未翻译。

标签: c++ recursion glsl tail-recursion raytracing


【解决方案1】:

要使用0.5 的因子,您可以执行以下操作:

vec3 color(ray r, hitableList list)
{
    hitRecord rec;
    vec3 unitDirection;
    float t;
    float factor = 1.f;

    while(hit(r, 0.0, FLT_MAX, rec, list))
    {
        vec3 target = rec.p + rec.normal;
        r = ray(rec.p, target-rec.p);
        factor *= 0.5f;
    }
    unitDirection = normalize(direction(r));
    t = 0.5* (unitDirection.y + 1.);
    return factor * ((1.-t)*vec3(1.)+t*vec3(0.5,0.7,1.));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2021-02-20
    • 2012-09-08
    相关资源
    最近更新 更多