use*_*501 2 opengl 3d graphics lighting
我今天遇到的一件事是,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在照明模型中没有多大意义,因为x在[-1.0,+ 1.0]的范围内(这是因为它来自a的背面触发余弦函数)你不能更严格地约束三角分布,你只能不那么严格地约束它.
比我在这里更好地解释这个的好参考包括:
交互式计算机图形学 - 一种自上而下的方法,使用Angel和Schreiner的基于着色器的OpenGL
OpenGL编程指南,版本4.3
以下答案也非常有用.
我想几年前当我问这个问题时,我可能随后问"为什么值不在0.0到1.0的范围内,然后这个值映射到指数的新值?" 这是另一个好问题,可能这是一个指数映射:y = exp(kx),x在[0.0,1.0]中.答案是"因为它不是那样设计的".虽然从"黑匣子"的角度来看这可能更有用,但对于在某种形式的实验中测量指数以希望实现真实材料模型的科学家来说,它并不是非常有用.
在大多数简单的照明模型中,镜面反射高光的亮度计算为入射角cos(theta) ^ n在哪里theta,并且n是光泽度值.
GL_SHININESS就是那个指数.值越高,突出显示的"越紧".
恕我直言,对于知道公式的人来说,使用给定的值更直观,而不是尝试使用0..1范围内的"标准化"值
| 归档时间: |
|
| 查看次数: |
2308 次 |
| 最近记录: |