我正在使用 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 的照明模型有很多版本,但我想了解哪些版本可以更改材质和灯光颜色。
在此先感谢,感谢所有的关注和帮助:)