2015-05-09 65 views
3

为什么一些OpenGL参数对于glColor3f和glNormal3等函数的值在0.0到1.0之间?这是一直困扰着我的问题;自从我的3D编程生涯开始以来,我一直都有这样的经历,但最初我只是像牛群一样跟着它一起走过。但为什么是0.0-1.0?这是Khronos集团作出的任意选择,还是更加存在的东西?为什么一些OpenGL参数需要0.0-1.0?

+0

单位法向矢量的分量在-1至1范围内而非0至1 – samgak

回答

3

因为小于0或大于1的值对这些事情没有意义。

对于颜色,用于显示目的的典型表示是从0到255的8位整数,但OpenGL不限于该特定表示; GL实现还可以支持48位颜色(每通道16位)或浮点颜色组件等内容。为了与底层表示无关,OpenGL中的颜色成分表示为0%到100%的分数,用数字0.0和1.0表示。 GL实现将这些值转换为显示器实际使用的任何格式(例如典型的0-255)。

法线应该是单位长度的向量,这意味着每个分量的长度自然不会大于1;否则整个向量的长度将大于1

请注意,这些值不实际上必须在0.0-1.0范围:

  • 对于颜色,显示器可以” t实际上显示亮度大于100%,但是如果颜色分量大于1.0,则它将乘以某种东西(例如纹理或比例因子),使其回到范围内。这通常用于HDR呈现。
  • 非单位长度的法线向量对于您听起来像您正在使用的传统固定功能光源并不是很有用,因为它们不符合现实世界的物理学,但您仍可以指定它们你会得到数学上正确的结果(虽然不现实或有用)。您还可以指定非单位长度的法线,并要求OpenGL使用GL_NORMALIZE自动将它们缩放到单位长度。

    在使用自定义着色器执行复杂照明计算的程序中,非单位长度向量可能很有用。

相关问题