我今天想到的一件事是 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]。答案是“因为它不是那样设计的”。虽然从“黑匣子”的角度来看,这可能更有用,但对于在某种形式的实验中测量指数以希望实现真实材料模型的科学家来说,它并不是很有用。