球体光线追踪 - 高光反射高光

时间:2016-11-13 02:19:30

标签: java render raytracing lighting

我在为我的球体设置正确的照明模型时遇到了一些麻烦。具体来说,我无法获得球体正确的镜面反射高光。这是我在光线追踪球体时所看到的:
Wrong specular highlights

现在,镜面高光应该看起来更像这样:
Correct specular highlights

据我所知,照明模型(对于这些漫反射球体)看起来像这样:
Lighting model

其中c r 是球体的颜色,c a 是光的环境成分,c l 是颜色光,n是球体交点处的法线,l是光的方向,c p 是镜面高光的颜色,{{ 1}}是eye / Look From,e是球体表面的反射向量,指数中的r指的是phong常数/指数(光线的紧密度/宽度)

这是我的流程:

p

请注意,在这种情况下,phong术语的眼睛成分是相机的外观,即(0,0,1),并且指向灯光的方向是(1,0,0)

为什么我的镜面高光在球体顶部而不是面向光线方向的任何想法?

如果我发布了您需要帮助我的任何重要细节,请告诉我。

2 个答案:

答案 0 :(得分:1)

反射矢量应根据曲面法线和入射光线方向计算,而不是像现在那样在光线方向上计算。

答案 1 :(得分:1)

问题在于这一行:

Vector reflectionVector = normal.multiply(2).multiply(normal.crossProduct(directionToLight)).subtract(directionToLight); //r = 2n(n \dot l) - l

而不是在法线和光线方向之间取点积,而是采用交叉生成normal.crossProduct(directionToLight),它会给你一个垂直于你想要的矢量,给你错误你在上面看到了。

相反,你应该

Vector reflectionVector = normal.multiply(2).multiply(normal.dotProduct(directionToLight)).subtract(directionToLight); //r = 2n(n \dot l) - l