0

我正在使用 Phong 公式作为参考来实现照明模型。我还不太清楚如何适当地渲染不同颜色的材料。我没有使用纹理。给定一个光点,我对每个像素使用的基本方程如下所示:

Result.R := Ia.R*ka.R + P.IL.R*((M.kd.R*LN) + (M.ks.R*Power(Max(VR,0),M.Ns)));
Result.G := Ia.G*ka.G + P.IL.G*((M.kd.G*LN) + (M.ks.G*Power(Max(VR,0),M.Ns)));
Result.B := Ia.B*ka.B + P.IL.B*((M.kd.B*LN) + (M.ks.B*Power(Max(VR,0),M.Ns)));

Result.R := Round(Result.R*255/3);
Result.G := Round(Result.G*255/3);
Result.B := Round(Result.B*255/3);

(* Where:
  Result : (R,G,B) color of pixel;
  Ia: intensity of Ambient Light for each component R, G, B;
  ka: material coefficient for reflection of ambient light;
  P: Dot Light;
  IL: intensity of Dot Light for each component R, G, B;
  kd: material coefficient for diffuse reflection of Dot Light;
  ks: material coefficient for specular reflection of Dot Light;
  LN: dot product (L.N);
  VR: dot product (V.R);
  L: Vector from pixel to Dot Light;
  N: Normal vector on the pixel;
  V: Vector from pixel to Observer;
  R: Reflected vector of L relative to N; *)

每个方程的最大值是 3,因为每个包裹(例如 Ia.R*ka.R)最多为 1。我调整结果,所以每个分量(Result.R、Result.G 和 Result.B)都保持不变在 0 到 255 的范围内。

它并不是完全这样编程的,因为当有多个点光源时,我会计算 Result 中所有光源的漫反射和镜面反射分量的总和。Ia*ka 组件不会改变。不是将上面除以 3,而是除以另一个数字(如果有 2 个点灯,则除以 5。如果有 3,则除以 7,依此类推)。

这种实现允许我通过 ka、kd 和 ks 系数来控制材质颜色。整体光色由 Ia 和 P.IL 控制。我一直在关注的模型与我在 Wikipedia 上找到的模型相似。

那时我想知道我是否犯了某种错误,是否误解了 Phong 的表述。我知道 Phong 的照明模型有很多版本,但我想了解哪些版本可以更改材质和灯光颜色。

在此先感谢,感谢所有的关注和帮助:)

4

1 回答 1

1

您犯的一个错误是规范化您的值而不是钳制。最后,您应该将结果限制在 0 和 1 之间。通过这样划分数字,您是说每个光源的贡献越少,光源越多。

假设有 10 盏非常非常强大的灯照射在同一区域,但只有一盏灯是打开的。在这种情况下,我们仍然期望一个更大的数字,因为即使是一盏灯也非常亮(接近 1),但是因为你将它们分开,它只是它应该是的一小部分。

其次是你错过了这一行:“虽然上述公式是呈现 Phong 反射模型的常用方式,但只有当项的点积为正时,才应包含每个项。(此外,仅当点的情况下才应包含镜面反射项扩散项的乘积为正。)"

这个数量:P.IL.R*((M.kd.R LN) + (M.ks.R Power(Max(VR,0),M.Ns))) 应该乘以因子 B。其中 B为 1 为 dot(L * N) > 0,否则为 0。这是因为如果 dot(L*N) < 0,那么光线会照射在表面的另一侧下方,我们不想计算它。

于 2016-08-26T08:38:11.233 回答