当前位置:文档之家› 4-OpenGL光照明

4-OpenGL光照明


参数名 GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_D IFFUSE GL_SPECULAR GL_SHINESS GL_EMISSION
缺省值 (0.2, 0.2, 0.2, 1.0) (0.8, 0.8, 0.8, 1.0)
说明 材料的环境光颜色 材料的漫反射光颜色 材料的环境光和漫反射 光颜色
GL_SPOT_DIRECTION (0.0,0.0,-1.0) GL_SPOT_EXPONENT 0.0 GL_SPOT_CUTOFF GL_CONSTANT_ATTE NUATION GL_LINER_ATTENUAT ION 180.0 1.0 0.0
GL_QUADRATIC_ATTE 0.0 NUATION
简单光照明模型
假设物体不透明则物体表面呈现的颜色仅由其反射光决定。 假设物体不透明则物体表面呈现的颜色仅由其反射光决定。 反射光组成 环境反射 环境反射假定入射光均匀地从周围环境入射至 景物表面并等量地向各个方向反射出去 漫反射与镜面反射 漫反射分量和镜面反射分量则表示特定光源照 射在景物表面上产生的反射光 要计算某一点的光亮度,就要分别求出这三个分量。 要计算某一点的光亮度,就要分别求出这三个分量。
pname 参数名 GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_POSITION
缺省值 (0.0, 0.0, 0.0, 1.0) (1.0, 1.0, 1.0, 1.0) (1.0,1.0,1.0,1.0) (0.0,0.0,1.0,0.0)
说明 RGBA模式下环境光 RGBA模式下漫反射光 RGBA模式下镜面光 光源位置齐次坐标 (x,y,z,w) 点光源聚光方向矢量 (x,y,z) 点光源聚光指数 点光源聚光截止角 常数衰减因子 线性衰减因子 平方衰减因子
镜面反射光为朝一定方向的反射光 镜面反射光为朝一定方向的反射光
N
入射光 反射光 入射光
N
n大
反射光
n小
采用余弦函数的幂次来模拟一般光滑表面的镜面反射光的空 间分布。 间分布。 n = k s I ps cos θ Is Is 为观察者接受到的镜面反射光亮度 Ips为入射光的光亮度 ks为镜面反射系数 与材料性质和入射光波长有关 为镜面反射系数(与材料性质和入射光波长有关 与材料性质和入射光波长有关) n为镜面反射光的会聚指数 与物体表面光滑度有关 为镜面反射光的会聚指数 与物体表面光滑度有关) 为镜面反射光的会聚指数(与物体表面光滑度有关 θ为镜面反射方向和视线方向的夹角,介于 o到90o之间 为镜面反射方向和视线方向的夹角, 为镜面反射方向和视线方向的夹角 介于0
(0.0, 0.0, 0.0, 1.0) 0.0 (0.0, 0.0, 0.0, 1.0)
材料的镜面反射光颜色 镜面指数(光亮度1128) 材料的辐射光颜色 材料的环境光、漫反射 光和镜面光颜色
GL_COLOR_INDEXES (0, 1, 1)
材质
• 对于材质,R、G、B值为材质对光的 、G、B成分的 对于材质, 、 、 值为材质对光的 值为材质对光的R、 、 成分的 反射率。比如,一种材质的R= 反射率。比如,一种材质的 =1.0、G=0.5、B= 、 = 、 = 0.0,则材质反射全部的红色成分,一半的绿色成分, ,则材质反射全部的红色成分,一半的绿色成分, 不反射蓝色成分。也就是说, 不反射蓝色成分。也就是说,若OpenGL的光源颜色 的光源颜色 ),材质颜色为 为(LR、LG、LB),材质颜色为(MR、MG、MB), 、 、 ),材质颜色为( 、 、 ), 那么,在忽略所有其他反射效果的情况下, 那么,在忽略所有其他反射效果的情况下,最终到达 眼睛的光的颜色为( 眼睛的光的颜色为(LR*MR、LG*MG、LB*MB)。 、 、 )。
单位法线 • 启用法线规范化,通知OpenGL自动将法线转换为单 启用法线规范化,通知 自动将法线转换为单 位法线。但效率会很低。 位法线。但效率会很低。 glEnable(GL_NORMALIZE); • 也可利用 也可利用glTools函数库里的: 函数库里的: 函数库里的 Void gltNormalizeVector(GLTVector VNormal); 可以接受任何法线向量为参数,对它进行单位化。 可以接受任何法线向量为参数,对它进行单位化。 • 用平面三个点来确定该平面的法线 Void gltGetNormalVector(GLTVector vP1,GLTvector vP2, GLTvector vP3,GLTVector vNormal); 如:GLTVector vPoints[3]={{ },{ },{ }}; gltGetNormalVector(vPoints[0], vPoints[1], vPoints[2],vNormal); glNormal3fv(VNormal);

颜色
• 颜色表模式(Color_Index Mode) • 可以调用glIndex*()函数从颜色表中选取当前 颜色。其函数形式为: • void glIndex{sifd}(TYPE c); • void glIndex{sifd}v(TYPE *c); 设置当前颜色索引值,即调色板号。若值大于颜 色位面数时则取模。
漫反射分量表示特定点光源在景物表面某一点的反射光中那 些向空间各方向均匀反射出去的光 表面对入射光在各个方向上都有强度相同的反射,因而无论 表面对入射光在各个方向上都有强度相同的反射,因而无论 从哪个角度观察,这一点的光亮度都是相同的。 从哪个角度观察,这一点的光亮度都是相同的。 对于一个漫反射体,表面的反射光亮度和光源入射角(入 对于一个漫反射体, 射光线和表面法向量的夹角)的余弦成正比,即 Ipd 射光线和表面法向量的夹角)的余弦成正比,
颜色
• 在RGBA模式下,可以用glColor*()来定义当前颜色。 其函数形式为: • void glColor3{b s i f d ub us ui}(TYPE r,TYPE g,TYPE b); • void glColor4{b s i f d ub us ui}(TYPE r,TYPE g,TYPE b,TYPE a); • void glColor3{b s i f d ub us ui}v(TYPE *v); • void glColor4{b s i f d ub us ui}v(TYPE *v);
以上列出的GL_DIFFUSE和GL_SPECULAR的缺省值只能用于 和 以上列出的 的缺省值只能用于 GL_LIGHT0,其他几个光源的 ,其他几个光源的GL_DIFFUSE和GL_SPECULAR 和 缺省值为(0.0,0.0,0.0,1.0)。 缺省值为 。
启动光照
• 使所有光源有效 glEnable(GL_LIGHTING); 若使光照无效, 若使光照无效,则调用 gDisable(GL_LIGHTING)。 。 只开一个光源或关闭一个则 glEnable(GL_LIGHT0); gDisable(GL_LIGHT0)。 。
创建具有某种特性的光源。 创建具有某种特性的光源。其中第一个参数light指定所 创建的光源号, 创建的光源号,如GL_LIGHT0、 、
GL_LIGHT1、...、GL_LIGHT7。第二个参数 、 、 。 pname指定光源特性,这个参数的辅助信息见下 指定光源特性, 指定光源特性 表所示。最后一个参数设置相应的光源特性值。 表所示。最后一个参数设置相应的光源特性值。
I=I环+I漫+I镜
简单光照明模型--环境反射光 简单光照明模型--环境反射光 --
环境反射光是由环境光在邻近物体上经过多次反射所产生的。 环境反射光是由环境光在邻近物体上经过多次反射所产生的。 光是来自四面八方的。 光是来自四面八方的。这种光产生的效应简化为它在各个方 向都有均匀的光强度 向都有均匀的光强度Ie,某一个可见物体在仅有环境光照明 的条件下,其上各点明暗程度完全一样。 的条件下,其上各点明暗程度完全一样。 环境反射光亮度可表示为: 环境反射光亮度可表示为:
材质
• OpenGL用材料对光的红、绿、蓝三原色的反射率来近 用材料对光的红、 用材料对光的红 似定义材料的颜色。 似定义材料的颜色。对环境光与漫反射光的反射程度决 定了材料的颜色, 定了材料的颜色,对镜面反射光的反射率通常是白色或 灰色(即对镜面反射光中红、 蓝的反射率相同)。 灰色(即对镜面反射光中红、绿、蓝的反射率相同)。 • void glMaterial{if}[v](GLenum face,GLenum pname,TYPE param) face可以是 可以是GL_FRONT、GL_BACK、 可以是 、 、 GL_FRONT_AND_BACK,它表明当前材质应该应用 , 到物体的哪一个面上; 说明一个特定的材质; 到物体的哪一个面上;pname说明一个特定的材质; 说明一个特定的材质 param是材质的具体数值,若函数为向量形式,则 是材质的具体数值, 是材质的具体数值 若函数为向量形式, param是一组值的指针,反之为参数值本身。 是一组值的指针, 是一组值的指针 反之为参数值本身。
I d = kd I pd cos i
Id为物体表面漫反射光的光亮度 Ipd为光源垂直入射时反射光的光 亮度,i为光源入射角 亮度 为光源入射角 kd 为漫射系数 , 决定于表面材料 为漫射系数, 及入射光的波长(0≤kd≤1) 及入射光的波长
Ipdcosi i
B C A
简单光照明模型--镜面反射光 简单光照明模型--镜面反射光 --
法线
• glBegin(GL_QUADS); glNormal3f(0.0f, 0.0f, 1.0f); glVertex3f(-x,-y, z); glVertex3f( x,-y, z); glVertex3f( x, y, z); glVertex3f(-x, y, z); • glEnd(); 对于一个多边形, 对于一个多边形,如果把它看作是根据法线向量所指向 方向进行绘制, 的 方向进行绘制,那么这几个顶点就是逆时针方向围绕 缺省情况下, 缺省情况下,如果一个多边形的各个顶点以逆时针的风 格出现,那么它就被定义为这个多边形的正面。 格出现,那么它就被定义为这个多边形的正面。
相关主题