当前位置:
文档之家› OPENGL-第4章颜色光照和材质
OPENGL-第4章颜色光照和材质
float green[] = {0, 1, 0, 1}; 漫反射 float white[] = {1, 1, 1, 1}; glMaterialfv(GL_FRONT, GL_DIFFUSE, 镜面反射 green); glMaterialfv(GL_FRONT, GL_SPECULAR, white);
材质
• 为什么我们能够看到物体颜色?(反射、吸收) • 反射某种光-颜色(物体反射的颜色,不同于光照射的 颜色) • 光泽:金属类的物体 • 无光泽:纸张、墙壁 • 发光属性:例如汽车尾灯 • 实际颜色成分: 光源的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 )
Opengl编程过程总结(续) 对每个场景 设定照相机: • glMatrixMode(矩阵类型) – 设定模型视 图矩阵或投影矩阵 • glLoadIdentity(...) – 矩阵还原 • glFrustrum(...) – 定义视体(透视投影) • glClear(...)
Opengl编程过程总结(续) 对每个对象 • 对每个对象: • glPushAttrib(...) – 存储当前属性参数 • glMaterial(...) – 在光反射模型中设定
glEnable(GL_LIGHTING); // 激活光源计算
// 建立和激活 light 0 glLightfv(GL_LIGHT0,GL_AMBIENT,ambi entLight);//环境光 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffus eLight);//漫反射光 glEnable(GL_LIGHT0);
0.0
0.7
1.0
背景光强度
简单光照明模型
• 简单光照模型:环境光+漫反射+镜面反射 • 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 ]
PC机的显示颜色
• 16位色:512种颜色 • 24位色:160万种颜色
• 32位真彩:颜色并不一定比24位多,其 中的8位用来存储 成分
颜色空间
• 24位色:RGB各8位:160万种颜色 • glColor3f(1.0,1.0,1.0)白色 • glColor3ub(255, 255, 255);白色
// 激活材质的颜色跟踪 glEnable(GL_COLOR_MATERIAL); // 以颜色值作为属性值 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // 背景色 glClearColor(0.0f, 0.0f, 1.0f, 1.0f ); }
glBeigin(GL_TRIANGLE);
… glEnd();
例子:sphere
物体的哪个面,光 反射类型 光反射的成分
材质函数-方法2
• 颜色跟踪法
用glColor设 置材质属性
glEnable(GL_COLOR_MATERIAL); //激活颜色属性
glColorMaterial(GL_FRONT, GL_DIFFUSE);
• 或:
• 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 :指定位置的光:
• 反射光:
– 环境光:光来自各个方向,以各方向反射出去 – 漫反射光::光来自某个方向,均匀反射出去 – 镜面反射光:光来自某个方向,以特定方向反射 出去
设置绘图颜色
• 颜色是针对顶点的 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
• 在多边形内的一点,利用光照模型计算颜色和光强, 内部所有点均填充这个颜色。 • 当一个物体用很多多边形近似时,多边形足够小,效 果不错
光类型,成分
射光(全局环境光), 默认 (0.2,0.2,0.2,1.0)
光源的位置、方向
• 多边形矢量(多边形面向的方向) • 光源位置 • 光源方向
光源
聚光灯 • 在场景中,光源要考虑的因素: 太阳 • 光源个数:允许多个光源 • 光源位置:光源放在什么地方?无穷远,有限 距离 • 光源种类: AMBIENT(环境光)/ DIFFUSE (漫反射光) • 光源强度:颜色的成分
每一种光源的成分由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);//光源模型 模型使用哪一种反
例子: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};
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 1 1]
[0.5 0 1]
[0 1 0]
Hale Waihona Puke 质函数• 光照模型的系数 (ka, kd, ks, nshiny) 作 为材质参数 • 哪些参数可以反映物体的真实颜色? • 实际效果与光源有关、与材料的反射率有 关。 • 对反射率:主要为漫反射系数: kd • 镜面反射一般不能反映物体真实颜色,而 只反映光源颜色。ks
材质函数-方法1
• 在多边形前设置函数:glMaterial(); • 光照模型的系数 (ka, kd, ks, nshiny) 作为材质参数 • 例如:设定当前材质
绘图技巧
–画图计划:画什么图? –步骤分解 –把需要画的放入绘制中 –选择默认状态,初始化这些状态 –按照上述框架和步骤逐步编写
绘图技巧-图形编程基本原则
–30%理解你需要的数据 –70%跟踪这些数据的位置,并刷新它 –适当建立场景和模型的数据结构
• 对每个绘制对象:
– 顶点定义... – ...
• glFlush(...) – 强制显示
Opengl编程过程总结 初始化部分
• • • • • glEnable/glDisable(...) – 激活各种功能 glViewport(...) – 定义视区 glShadeModel(...) – 明暗处理模型 glTexImage(...) – 设定纹理 glTexParameter(...) – 设定控制纹理标 记
第4章 颜色光照和材质
•主要内容:
–如何使用颜色 –明暗处理模型 –设置光照模型 –设置光照参数 –设置材质反射属性 –使用表面法线
第4章 真实感显示
•颜色:glColor •光照: glShadeModel, glLightModel, glLight(参数) •材质: glColorMaterial/ glMaterial •法矢 glNormal
glShadeModel(处理类型);
GL_FLAT :均匀着色,按显示多边形的最后一个顶点 Triangle.c 的颜色,即同一颜色。