文件名称:法线向量-高等数学习题全解指南
文件大小:832KB
文件格式:PDF
更新时间:2024-07-01 11:15:21
OpenGL入门
二、法线向量 根据光的反射定律,由光的入射方向和入射点的法线就可以得到光的出射方向。因此, 对于指定的物体,在指定了光源后,即可计算出光的反射方向,进而计算出光照效果的 画面。在 OpenGL 中,法线的方向是用一个向量来表示。 不幸的是,OpenGL 并不会根据你所指定的多边形各个顶点来计算出这些多边形所构成 的物体的表面的每个点的法线(这话听着有些迷糊),通常,为了实现光照效果,需要在 代码中为每一个顶点指定其法线向量。 指定法线向量的方式与指定颜色的方式有雷同之处。在指定颜色时,只需要指定每一个 顶点的颜色,OpenGL 就可以自行计算顶点之间的其它点的颜色。并且,颜色一旦被指 定,除非再指定新的颜色,否则以后指定的所有顶点都将以这一向量作为自己的颜色。 在指定法线向量时,只需要指定每一个顶点的法线向量,OpenGL 会自行计算顶点之间 的其它点的法线向量。并且,法线向量一旦被指定,除非再指定新的法线向量,否则以 后指定的所有顶点都将以这一向量作为自己的法线向量。使用 glColor*函数可以指定颜 色,而使用 glNormal*函数则可以指定法线向量。 注意:使用 glTranslate*函数或者 glRotate*函数可以改变物体的外观,但法线向量并不会 随之改变。然而,使用 glScale*函数,对每一坐标轴进行不同程度的缩放,很有可能导 致法线向量的不正确,虽然 OpenGL 提供了一些措施来修正这一问题,但由此也带来了 各种开销。因此,在使用了法线向量的场合,应尽量避免使用 glScale*函数。即使使用, 也最好保证各坐标轴进行等比例缩放。 三. 控制光源 在 OpenGL 中,仅仅支持有限数量的光源。使用 GL_LIGHT0 表示第 0 号光源,GL_LIGHT1 表示 第 1号光源,依次类推,OpenGL至少会支持 8个光源,即GL_LIGHT0到GL_LIGHT7。使用 glEnable 函数可以开启它们。例如,glEnable(GL_LIGHT0);可以开启第 0 号光源。使用 glDisable 函数则可 以关闭光源。一些 OpenGL 实现可能支持更多数量的光源,但总的来说,开启过多的光源将会导 致程序运行速度的严重下降,玩过 3D Mark 的朋友可能多少也有些体会。一些场景中可能有成百 上千的电灯,这时可能需要采取一些近似的手段来进行编程,否则以目前的计算机而言,是无法 运行这样的程序的。 每一个光源都可以设置其属性,这一动作是通过 glLight*函数完成的。glLight*函数具有三个参数, 第一个参数指明是设置哪一个光源的属性,第二个参数指明是设置该光源的哪一个属性,第三个 参数则是指明把该属性值设置成多少。光源的属性众多,下面将分别介绍。 (1)GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR 属性。这三个属性表示了光源所发出的光 的反射特性(以及颜色)。每个属性由四个值表示,分别代表了颜色的 R, G, B, A 值。GL_AMBIENT 表示该光源所发出的光,经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)。 GL_DIFFUSE 表示该光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光的强度(颜色)。 GL_SPECULAR 表示该光源所发出的光,照射到光滑表面时经过镜面反射,所得到的光的强度(颜 色)。 (2)GL_POSITION 属性。表示光源所在的位置。由四个值(X, Y, Z, W)表示。如果第四个值 W 为零,则表示该光源位于无限远处,前三个值表示了它所在的方向。这种光源称为方向性光源, 通常,太阳可以近似的被认为是方向性光源。如果第四个值 W 不为零,则 X/W, Y/W, Z/W 表示了