我在为我的球体设置正确的照明模型时遇到了一些麻烦。具体来说,我无法获得球体正确的镜面反射高光。这是我在光线追踪球体时所看到的:
其中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)
为什么我的镜面高光在球体顶部而不是面向光线方向的任何想法?
如果我发布了您需要帮助我的任何重要细节,请告诉我。
答案 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