
OPENGL-第4章颜色光照和材质.ppt
34页第4章 颜色光照和材质•主要内容: – 如何使用颜色 – 明暗处理模型 – 设置光照模型 – 设置光照参数 – 设置材质反射属性 – 使用表面法线第4章 真实感显示•颜色:glColor •光照: glShadeModel, glLightModel, glLight(参数) •材质: glColorMaterial/ glMaterial •法矢 glNormalPC机的显示颜色• 16位色:512种颜色 • 24位色:160万种颜色• 32位真彩:颜色并不一定比24位多,其 中的8位用来存储 成分颜色空间• 24位色:RGB各8位:160万种颜色 • glColor3f(1.0,1.0,1.0)白色 • glColor3ub(255, 255, 255);白色设置绘图颜色• 颜色是针对顶点的glbegin(GL_TRIANGLES); glColor3ub(255,0,0); glVertex3f(0.0,200.0,0.0); glColor3f(0.0,255.0,0.0); glVertex3f( 200.0,-70.0,0.0); glColor3f(0.0,0,255); glVertex3f( -200.0,-70.0,0.0); glEnd();例子:颜色光照和材质 / Triangle.c多边形光滑颜色处理• 光照模型: I=Ia • Ka+Ip • Kd •(L • N)+Ip • Ks •(R•V)n• 方法: –均匀着色:每个多边形填充一种颜色–Gouraud着色方法:计算I,插值I明暗处理模型1• 在多边形内的一点,利用光照模型计算颜色和光强, 内部所有点均填充这个颜色。
• 当一个物体用很多多边形近似时,多边形足够小,效 果不错glShadeModel(处理类型);GL_FLAT :均匀着色,按显示多边形的最后一个顶点的 颜色,即同一颜色Triangle.c明暗处理模型2glShadeModel(处理类型);处理类型为: GL_SMOOTH:光滑处理,颜色逐步过渡 ,颜色插值方法Triangle.c例子:颜色光照材质/sphere1光照显示的过程功能要求•定义物体顶点的法向量,会影响物体表面 的相对位置 •设定光源(位置、光强、颜色 •建立光照模型(反射光) •定义材质(反射率,光泽度)漫反射与镜面反射的效果漫反射强度镜面反射强度镜面反射与有色环境光照的效果背景光强度0.00.00.70.71.01.0[0 1 0][0 1 0][0.5 0 1][0.5 0 1]环境光颜色[1 1 1][1 1 1]简单光照明模型• 简单光照模型:环境光+漫反射+镜面反射 • I=Ie+Id+Is • I = Ia • Ka + Ip • Kd •(L • N) + Ip • Ks •(R•V)n • 色彩的三分量: • Ir = Iar • Kar + Ipr [Kdr (L • N) + Ks (R•V)n ] • Ig = Iag • Kag + Ipg [Kdg (L • N) + Ks (R•V)n ] • Ib = Iab • Kab + Ipb [Kdb (L • N) + Ks (R•V)n ] • 或: • I(r,g,b)=Ia(r,g,b) Ka(r,g,b) • +Ip(r,g b)[Kd(r,g,b) (L • N)+Ks (R•V)n ]光源• 2种光源: – 环境光Ia :光来自各个方向 – 某个光源Ip :指定位置的光: • 反射光: – 环境光:光来自各个方向,以各方向反射出去 – 漫反射光::光来自某个方向,均匀反射出去 – 镜面反射光:光来自某个方向,以特定方向反射 出去 每一种光源的成分由RGBA定义 实际光源:2种光源的合成。
显示过程:场景中如何加光源?• 定义光源(光源参数) • 激活光源(光源可用) • 设置光照模型(使用什么光?) • 设置材质属性使光源生效和设置光照模型• 使光源生效函数:glEnable(GL_LIGHTING);• 设置光照模型: GLfloat am[ ]={1.0,1.0,1.0,1.0};//定义光源分量 glEnable(GL_LIGHTING);//光源生效 glLightModelfv(GL_LIGHT_MODEL_AMBIEN T, am);//光源模型可以利用材质 属性和光照参 数决定场景中 每个顶点的颜 色模型使用哪一种反 射光(全局环境光) ,默认( 0.2,0.2,0.2,1.0)光类型,成分光源的位置、方向• 多边形矢量(多边形面向的方向) • 光源位置 • 光源方向光源• 在场景中,光源要考虑的因素: • 光源个数:允许多个光源 • 光源位置:光源放在什么地方?无穷远,有限 距离 • 光源种类: AMBIENT(环境光)/ DIFFUSE( 漫反射光) • 光源强度:颜色的成分太阳聚光灯例子:litjet,漫反射和环境光,设置光源设置某个光源:种类、分量、位置GLfloat amb[]= {0.3,0.3,0.3,1.0}; GLfloat dif[]= {0.7,0.7,0.7,1.0}; GLfloat pos[]= {-50,50,100,1.0};glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0,GL_AMBIENT,amb); glLightfv(GL_LIGHT0,GL_DEFFUSE,dif);glEnable(GL_LIGHT0);最多可以有8个光源。
1:光源在该矢量方向 的无穷远处 0:在指定的位置• 光源0的位置-左上角视点后 • 光源0的类型:包含环境光和漫反射,白色 光• 过程: – 光源0的参数定义– 激活光源计算 – 建立光源0并激活– 设置材质属性(采用颜色跟踪方法)举例:创建光源(初始化)06-litjet的SetupRCvoid SetupRC() { GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f }; GLfloat diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f };glEnable(GL_DEPTH_TEST);// 消隐 glFrontFace(GL_CCW);// 面的方向 glEnable(GL_CULL_FACE);//不计算反面glEnable(GL_LIGHTING); // 激活光源计算光源0的参数定义和激活光源// 建立和激活 light 0 glLightfv(GL_LIGHT0,GL_AMBIENT,ambi entLight);//环境光 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffus eLight);//漫反射光 glEnable(GL_LIGHT0);// 激活材质的颜色跟踪 glEnable(GL_COLOR_MATERIAL);// 以颜色值作为属性值 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);// 背景色 glClearColor(0.0f, 0.0f, 1.0f, 1.0f ); }材质• 为什么我们能够看到物体颜色?(反射、吸收) • 反射某种光-颜色(物体反射的颜色,不同于光照射的 颜色) • 光泽:金属类的物体 • 无光泽:纸张、墙壁 • 发光属性:例如汽车尾灯• 实际颜色成分: 光源的RGB和物体对光的反射属性的RGB值的乘积材质-环境光的效果例如: 环境光亮度(0.5, 0.5, 0.5),影响到物体表面 物体的反射属性(0.5, 1.0 ,0.5);最终的反射颜色: ( 0.5×0.5, 0.5× 1.0 , 0.5× 0.5 )=(0.25, 0.5, 0.25 )材质函数• 光照模型的系数 (ka, kd, ks, nshiny) 作为 材质参数 • 哪些参数可以反映物体的真实颜色? • 实际效果与光源有关、与材料的反射率有 关。
• 对反射率:主要为漫反射系数: kd • 镜面反射一般不能反映物体真实颜色,而 只反映光源颜色ks材质函数-方法1• 在多边形前设置函数:glMaterial(); • 光照模型的系数 (ka, kd, ks, nshiny) 作为材质参数 • 例如:设定当前材质 float green[] = {0, 1, 0, 1}; float white[] = {1, 1, 1, 1}; glMaterialfv(GL_FRONT, GL_DIFFUSE, green); glMaterialfv(GL_FRONT, GL_SPECULAR, white);glBeigin(GL_TRIANGLE); … glEnd();漫反射镜面反射物体的哪个面,光 反射类型 光反射的成分 例子:sphere材质函数-方法2• 颜色跟踪法glEnable(GL_COLOR_MATERIAL); //激活颜色属性 glColorMaterial(GL_FRONT, GL_DIFFUSE); glColor3f(.75,.75,.75); glBeigin(GL_TRIANGLE); … glEnd();直接用颜色参数用glColor设 置材质属性方法2的优点是:可以直接用颜色设定 显示的颜色,符合习惯例子:sphere1Opengl编程过程总结• 初始化 – … • 对每个场景: – 建立相机 … • 对每个光源 … – glLight(...) – 设定光源参数 • 对每个绘制对象: – 顶点定义... – ... • glFlush(...) – 强制显示Opengl编程过程总结 初始化部分 • glEnable/glDisable(...) – 激活各种功能 • glViewport(...) – 定义视区 • glShadeModel(...) – 明暗处理模型 • glTexImage(...) – 设定纹理 • glTexParameter(...) – 设定控制纹理标 记Opengl编程过程总结(续) 对每个场景设定照相机: • glMatrixMode(矩阵类型) – 设定模型视 图矩阵或投影矩阵 • glLoadIdentity(...) – 矩阵还原 • glFrustrum(...) – 定义视体(透视投影 ) • glClear(...)Opengl编程过程总结(续) 对每个对象• 对每个对象: • glPushAttrib(...) – 存储当前属性参数 • glMaterial(...) – 在光反射模型中设定 参数 • glPushMatrix(...) – 存储当前变换 • glScale/glTranslate/glRotate(...) – 设 定当前变换参数Opengl编程框架(续)对每个图素• 对每个图素序列: -- point list, tri strip, quad list, etc • glBegin(...) – 指定图素和顶点顺序,对每个顶点–glNormal(...) – 设当前顶点的法矢–glTexCoord(...) – 设当前顶点的纹理坐标–glVertex(...) – 顶点 – …… • glEnd(...) • glPopMatrix(...) – 恢复以前的变换矩阵• glPopAttrib(...) – 恢复以前的属性绘图技巧–画图计划:画什么图? –步骤分解 –把需要画的放入绘制中 –选择默认状态,初始化这些状态 –按照上述框架和步骤逐步编写绘图技巧-图形编程基本原则–30%理解你需要的数据 –70%跟踪这些数据的位置,并刷新它 –适当建立场景和模型的数据结构。
