光线追踪 - 遍历树

时间:2014-04-05 21:14:32

标签: java raytracing

我写了一个光线跟踪程序,除了我用来遍历光线树的算法之外,一切似乎都在起作用,我不确定是否正确。在每个碰撞点,程序存储对象的颜色,其反射率指数和该点处的光强度(镜面和漫反射,环境是常数)。有人可以帮助我并向我解释当我穿越光线树时,我应该如何将物体的颜色和光线强度结合起来?

3 个答案:

答案 0 :(得分:1)

来自Nvidia Developer Zone

surfaceColor = emissive + ambient + diffuse + specular

下面,

  • emissive = Ke

    其中:

    • Ke是材料的发光颜色。
  • ambient = Ka x globalAmbient

    其中:

    • Ka是材料的环境反射率和
    • globalAmbient是传入环境光的颜色。
  • 漫反射= Kd x lightColor x max(N·L,0)

    其中:

    • Kd是材质的漫反射颜色,
    • lightColor是传入漫反射光的颜色,
    • N是标准化曲面法线,
    • L是朝向光源的归一化矢量,并且
    • P是被遮挡的点。
  • 镜面反射= Ks x lightColor x面向x(最大(N·H,0))^光泽

    其中:

    • Ks是材质的镜面反射颜色,
    • lightColor是传入的镜面反射光的颜色,
    • N是标准化曲面法线,
    • V是朝向视点的归一化向量,
    • L是朝向光源的归一化矢量,
    • H是V和L之间的归一化矢量,
    • P是阴影点,
    • 如果N·L大于0,则
    • 面向1,否则为0。

答案 1 :(得分:0)

我认为你应该使用一些局部照明模型。 U具有计算此反射模型的所有值:Phong reflection model

答案 2 :(得分:0)

最简单的是,对于多个对象,其中n是当前的对象:

每个对象都会接收下一个对象发出的光。

incoming_light[n] = outgoing_light[n+1]

每个物体的接收光都会被其漫反射颜色以及入射角(光线方向和正常的点积)过滤掉,如果你的出射光线已经是余弦分布,你可以跳过这个:

outgoing_light[n] += incoming_light[n] * diffuse[n] * cosine_term[n]

最后,像素颜色就是你击中的第一个物体发出的光。

final_color = outgoing_light[0]