为什么我的漫反射照明在 Java 中计算错误?

Why is my diffuse illumination calculated wrongly in Java?

我对 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 不允许我 post 我的图片,所以我只能将它包含在 link 中(见下文)。 Image of Equation

因为这是一个重大项目,所以当我如此严格地遵循等式时,我不明白为什么我的实现是错误的。我已将错误来源缩小到此代码片段,希望有人能告诉我我的代码哪里出错了。

我似乎找不到错误,因为它完全遵循等式。

问题是对 N_dot_L 所需符号的误解。

您的计算方式 L 给出了从光源到表面上的点的矢量;如果光线到达表面,则点积 N_dot_L 将是 负值 而不是正值 - 因此通过取 Math.max 和 0,你是 总是对于暴露在光线下的表面将其固定为零。

要解决这个问题,请在 相反方向 取光线矢量,即 L = ((light.getPosition()).subtract(P)).normalized()