【问题标题】:Color of Material in Phong Shading Illumination ModelPhong Shading Illumination 模型中材质的颜色
【发布时间】:2017-01-01 15:37:38
【问题描述】:

我正在实现一个使用 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 控制。我一直关注的模型类似于我在维基百科上找到的one

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

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

【问题讨论】:

    标签: graphics lighting phong


    【解决方案1】:

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

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

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

    这个数量:P.IL.R*((M.kd.RLN) + (M.ks.RPower(Max(VR,0),M.Ns))) 应该乘以因子 B。如果 B 为 1,则 dot(L * N) > 0,否则为 0。这是因为如果 dot(L*N)

    【讨论】:

    • 好的,我没有发布您指出的第二条评论的代码部分。对于那个很抱歉。虽然我仍然对灯的数量感到困惑。如果我不断添加新灯,它必须每次都变得更亮。但是如果我有一个很亮的灯,效果不一样吗?
    • 但是关于我处理颜色的方式,有什么不妥之处吗?
    • 您的结果中是否有某些东西向您表明颜色已关闭?你也不应该对颜色进行标准化,而不是 Round(...) 你应该做 Clamp(Result.R, 0, 255)。环境光、镜面反射和漫反射应该能够各自拥有 0-1 的范围。您是说它们的范围为 0-0.333。所以这意味着如果我没有镜面反射或环境光,我永远不会有一个仅基于漫反射的白色像素。
    • 对不起,如果我解释得很奇怪。让我简单地说。假设每盏灯的漫反射贡献为 1。所以十盏灯 = 10 * 1 = 10。但这超出了我们的范围。所以它应该是 1。在某些情况下,将值限制为这个最大值是错误的 (10 * 1) / 10 = 1。因为如果我们有十盏灯,但只有一盏灯亮着怎么办?那么 9 * 0 + 1 * 1 = 1 应该是我们的结果。但是如果你做了 (9 * 0 + 1 * 1) / 10 = 0.1 那么它就太暗了。
    • 在划分之前,我会检查是否验证灯是否打开。但是,放出许多灯的这一部分,当我除以 3 时,我认为每个地块,比如 Ia*ka,都有 0-1 的范围。所以它不会是 0-0.333
    猜你喜欢
    • 2018-07-07
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2018-10-12
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多