我用于L,V和R的等式是:
Vector3 L = (P.subtract(light.getPosition())).normalised();
Vector3 V = P.subtract(O).normalised();
Vector3 R = L.normalised().reflectIn(N.normalised()).normalised();
ColorRGB diffuse = C_diff.scale(k_d).scale(I);
double N_dot_L = N.normalised().dot(L.normalised());
N_dot_L = Math.max(0.0, N_dot_L);
diffuse = diffuse.scale(N_dot_L);
ColorRGB specular = C_spec.scale(k_s).scale(I);
double R_dot_V = R.normalised().dot(V.normalised());
R_dot_V = Math.pow(Math.max(0.0, R_dot_V), alpha);
specular = specular.scale(R_dot_V);
其中
不幸的是,SO不允许我发布我的图片,因此我只能将其包含在链接中(见下文)。 Image of Equation
由于这是一个重大项目,因此当我如此密切关注等式时,我无法理解为什么我的实现是错误的。我已经将错误来源缩小到这段代码片段,希望有人能告诉我代码出错的地方。
我似乎无法找到错误,因为它完全遵循等式。
答案 0 :(得分:0)
问题在于对N_dot_L
所需符号的误解。
你计算L
的方式给出了一个矢量从光到表面上的点;如果光线到达表面,那么点积N_dot_L
将负而不是正 - 所以通过取Math.max
它和0,你总是对于暴露在光线下的表面,将其夹紧到零。
要解决此问题,请在相反方向中拍摄光线矢量,即L = ((light.getPosition()).subtract(P)).normalized()
。