为什么我的漫反射照明在 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);
在哪里
- L为光源到物体的光线方向矢量
- V是物体到相机的方向向量
- R为反射光线方向矢量,与L相反,关于表面法线
- C_diff and C_spec and alpha 是等式
中的常量
不幸的是,SO 不允许我 post 我的图片,所以我只能将它包含在 link 中(见下文)。
Image of Equation
因为这是一个重大项目,所以当我如此严格地遵循等式时,我不明白为什么我的实现是错误的。我已将错误来源缩小到此代码片段,希望有人能告诉我我的代码哪里出错了。
我似乎找不到错误,因为它完全遵循等式。
问题是对 N_dot_L
所需符号的误解。
您的计算方式 L
给出了从光源到表面上的点的矢量;如果光线到达表面,则点积 N_dot_L
将是 负值 而不是正值 - 因此通过取 Math.max
和 0,你是 总是对于暴露在光线下的表面将其固定为零。
要解决这个问题,请在 相反方向 取光线矢量,即 L = ((light.getPosition()).subtract(P)).normalized()
。
我对 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);
在哪里
- L为光源到物体的光线方向矢量
- V是物体到相机的方向向量
- R为反射光线方向矢量,与L相反,关于表面法线
- C_diff and C_spec and alpha 是等式 中的常量
不幸的是,SO 不允许我 post 我的图片,所以我只能将它包含在 link 中(见下文)。 Image of Equation
因为这是一个重大项目,所以当我如此严格地遵循等式时,我不明白为什么我的实现是错误的。我已将错误来源缩小到此代码片段,希望有人能告诉我我的代码哪里出错了。
我似乎找不到错误,因为它完全遵循等式。
问题是对 N_dot_L
所需符号的误解。
您的计算方式 L
给出了从光源到表面上的点的矢量;如果光线到达表面,则点积 N_dot_L
将是 负值 而不是正值 - 因此通过取 Math.max
和 0,你是 总是对于暴露在光线下的表面将其固定为零。
要解决这个问题,请在 相反方向 取光线矢量,即 L = ((light.getPosition()).subtract(P)).normalized()
。