首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混合着色器在我的路径追踪器上看上去不对

混合着色器在我的路径追踪器上看上去不对
EN

Computer Graphics用户
提问于 2017-01-06 04:23:02
回答 1查看 329关注 0票数 6

我很抱歉,如果我的方法看起来很遥远,因为这是我第一次尝试构建路径跟踪器,而且我正在努力奋斗。目前,我试图模仿混合式3D混合着色器节点,它结合了两个不同的着色器。我想把这个功能添加到我的路径追踪器中,因为它允许我制作一种类似塑料的材料。阅读几个解释,它似乎需要一个概率的方法来选择一个或另一个当射线击中表面。

以下是以每像素80个样本绘制具有理想反射和理想扩散的50/50混合的物体:

只是有点不对劲。尤其是那些奇怪的侧边突出的腿部,向左延伸最远。我有种强烈的感觉,我把它搞错了。

下面是路径跟踪部分的伪实现。它使用显式光采样。基于小径追踪器。

代码语言:javascript
复制
rayColor(ray r, depth, int E=1)
{
    if(r doesn't hit triangle)
        return 0
    if(r hit is a light)
    {
       if(E)
         return light_emission
       else
         return 0
    }

    vector x = r.origin + r.direction*t // x is point where r hit tri
    vector n = normal where ray hit triangle
    n.normalize()
    vector nl = n.dot(r.d) < 0 ? n : n*(-1) // properly orient normal

    if(++depth > 5) return 0 // max bounces

    float triangle_area   = area of emitting triangle
    vector x_light_random = random point on emitting triangle
    vector light_normal   = normal of emitting triangle

    vector d = x_light_random = x_converted;


    if(light_normal.dot(d) > 0) light_normal *= -1; // make it emit
                                                    // both sides

    object_normal.normalize();
    light_normal.normalize();

    BRDF = 1/PI // perfect diffuse
    light_emitted = 1 // emission of 1
    vector light_out = 0
    if(ray starting at x towards d hits light (i.e. not in shadow))
    {
         light_out = BRDF*light_emitted*(object_normal.dot(d))*
                            (-1*light_normal.dot(d)*triangle_area)/
                            (d.length*d.length*d.length*d.length)
    }
    vector direct_light = color_of_object_triangle*light_out;



  //----SPECULAR-----
  vector d2 = r.dir-n*2*n.dot(r.dir); // ideal reflection
  vector light_color = 1 // white since dialectics don't change spec
  vector specular = light_color*rayColor(createRay(x, d2),depth)

  float P = 0.5; // 50/50 chance of mirror/diffuse
  if(erand(Xi) < P)
      return direct_light/P
  else
      return spec/(1-P)

谢谢任何能给我指点的人!再一次,如果这件事真的很复杂的话,很抱歉。到目前为止我已经成功了,我要放弃了,但我觉得我真的很亲密。

EN

回答 1

Computer Graphics用户

发布于 2017-01-06 16:10:43

正如评论中所建议的那样,我使用相同的.obj在Blender中创建了一个精确的场景。在添加混合着色器节点并将一边设置为扩散,另一侧设置为完美的镜子后,您可以看到结果几乎是相同的。这表明我的实现是正确的。

下面是一个并排的比较。我的在左边,搅拌器在右边:

票数 4
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/4483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档