4

我今天想到的一件事是 OpenGL 将 GL_SHININESS 材质组件指定为介于 0.0 和 128.0 之间,而不是介于 0.0 和 1.0 之间。

据我所知,您可以使用浮点值指定的所有其他值的范围都在 0.0 到 1.0 之间。与 GL_SHININESS 不同的原因是什么?

编辑:

另请参阅我在下面发布的新答案中的笔记。

由于光照模型的构造方式,0.0 到 1.0 的范围没有任何意义。光泽系数用作指数。在 [0.0, 1.0] 范围内为 y 提高 x^y 在光照模型中没有多大意义,因为对于 [-1.0, +1.0] 范围内的 x(这是因为它来自三角余弦函数)你不能更严格地约束三角分布,你只能不那么严格地约束它。

比我在这里做的更好地解释这一点的好的参考资料包括:

  • 交互式计算机图形学——Angel 和 Schreiner 使用基于着色器的 OpenGL 的自顶向下方法

  • OpenGL 编程指南,4.3 版

下面的答案也很丰富。

我想当我几年前问这个问题时,我可能随后会问“为什么这个值不在 0.0 到 1.0 的范围内,然后这个值映射到指数的新值?” 这是另一个好问题,大概这将是一个指数映射:y = exp(kx), x in [0.0, 1.0]。答案是“因为它不是那样设计的”。虽然从“黑匣子”的角度来看,这可能更有用,但对于在某种形式的实验中测量指数以希望实现真实材料模型的科学家来说,它并不是很有用。

4

3 回答 3

9

在大多数简单的照明模型中,镜面高光的亮度是根据入射角和光泽值计算的cos(theta) ^ nthetan

GL_SHININESS是那个指数。值越高,高光就越“紧”。

恕我直言,对于知道公式的人来说,使用给定的值更直观,而不是尝试使用 0..1 范围内的“标准化”值

于 2013-07-18T14:11:38.387 回答
4

因为光泽度是指数/幂,只有 [0.0, 1.0] 之间的值意味着只允许第n个根,而不是更高的幂,如平方、立方等。

于 2013-07-18T14:16:10.357 回答
2

将我自己的评论添加到之前的评论中:

OpenGL 光泽系数用于光照模型中的指数,其中镜面反射系数由 cos^alpha(beta) 计算,其中 alpha = GL_SHININESS 系数,beta 是反射法线方向和相机方向之间的角度 (在模型视图矩阵数学的OpenGL相机模型解释中)。

大于 1.0 的值会给出更“严格约束的分布”或反射光锥。为什么恰好 128.0 是最大值?可能是因为它是一个运行良好的值。与 1.0 数量级的数字相比,使用此数量级的数字时,可观察到的效果不会有太大差异。我猜 OpenGL 标准委员会可能会选择 1024.0 或 64.0(等),但差异不会那么显着。

于 2015-10-12T23:01:25.750 回答