Phong着色照明模型中的材料颜色

时间:2016-08-25 09:19:33

标签: graphics lighting phong

我使用作为参考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之间。

这不是这样编程的,因为当有多个Dot Light时,我会计算Result中所有灯光的Diffuse和Specular组件的总和。 Ia * ka组件不会改变。不是将上面除以3,而是将其除以另一个数字(如果有2个点灯,它除以5.如果有3,则按7,依此类推。)

这种实现允许我通过ka,kd和ks系数控制材料颜色。整体的浅色由Ia和P.IL控制。我一直遵循的模型类似于我在维基百科上找到的one

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

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

1 个答案:

答案 0 :(得分:1)

您正在犯的一个错误是将您的值归一化而不是钳位。你应该在最后,把结果夹在0和1之间。通过划分这样的数字,你说每个光源对光源的贡献越少。

让我们举例来说,有10个非常强大的灯照在同一个区域,但只有一个被打开。在这种情况下,我们期待一个非常大的数字仍然是因为即使一个光非常明亮(接近1),但是因为你将它们分开,它只是它本来应该的一小部分。

第二,你错过了这一行:"虽然上述公式是呈现Phong反射模型的常用方法,但只有当术语的点积为正时,才应包括每个术语。 (此外,只有当漫反射词的点积为正时,才应包括镜面术语。)"

该数量:P.IL.R *((M.kd.R LN)+(M.ks.R 功率(Max(VR,0),M.Ns))) 应该乘以因子B.其中B是1是点(L * N)> 0,否则为0。这是因为如果点(L * N)< 0,然后光照在表面另一侧的下方,我们不想数数。