OPENGL-第4章颜色光照和材质

合集下载

OpenGL完全教程 第五章 颜色、光照和材质

OpenGL完全教程 第五章 颜色、光照和材质

OpenGL完全教程 第五章 颜色、光照和材质作者:何咏 日期:2006-2-3 20:53:31 点击:4493如需转载本文,请声明作者及出处。

第五章 颜色、光照和材质在第四章的示例程序中,我们使用了光照效果,这使得图形更加逼真。

本章就要具体讲解OpenGL 中的色彩调配和光照系统。

学习本章,你将了解:•在OpenGL中设置物体的颜色•OpenGL中光源的种类及创建方法•为顶点指定法线•设置物体的材质5.1 OpenGL中的颜色在未使用光照系统的前提下,我们可以直接为图元指定颜色。

在传入顶点之前调用glColor函数,就可以为即将指定的顶点设置颜色。

例如:glBegin(GL_TRIANGLES);glColor3ub(255,0,0);glVertex3f(0,1,0);glVertex3f(1,0,1);glVertex3f(1,1,0);glEnd;将绘制一个红色的三角形。

在绘制图元时,OpenGL会自动将图元的第一个顶点的颜色作为整个图元的颜色。

但有些时候,你可能希望为一个图元的各个顶点指定不同的颜色,使它们自然过度,就像图5.1-1那样。

图5.1-1这时,我们需要在绘制图元之前调用如下函数:glShadeModel(GL_SMOOTH);让OpenGL对顶点之间的颜色进行平滑过度。

你可以把参数改为GL_FLAT,禁止OpenGL对顶点进行平滑过度。

5.2 OpenGL 光照模效果的原理OpenGL的光照模型是用来模拟现实生活中的光照的。

你可以使用OpenGL中的光照模型以产生逼真的光照图象。

它根据顶点的法线向量和光源的位置决定顶点的明暗程度,根据顶点的材质和光源中三原色的成分来决定物体将表现出怎样的颜色。

有关法线是如何能够决定明暗程度的,在初中物理课本中已经有了详细的讲解,这里不再复述。

值得一提的是材质。

OpenGL中的材质并非我们平常所说的组成物体的元素(如木材、金属材质),而是指一个物体对不同颜色的光的反射和吸收程度。

材质与光照

材质与光照

OpenGL材质和灯光一、实验目的1、理解光照与材质在真实感图形中的作用;2、掌握OpenGL中的光照模型和参数设置方法;3、掌握OpenGL中的材质参数设置方法。

二、实验内容1、光照glLight()中各个参数的含义void glLighti (GLenum light,GLenum pname,GLint param);启用的灯光号,光源光的参数指向那个光源(灯光号)参数被设置指向启用的灯光的指针OpenGL中各个模式(如灯光的启用或禁止)的启用和禁止的函数为:glEnable( GLenum cap )、glDisable (GLenum cap );2、颜色:OpenGL通过指定红、绿、蓝(RGB)三个成分的各自亮度来确定颜色,有时还有第四个成分alpha:glColor*(red, green, blue[, alpha]);glColor()函数设置当前的绘图颜色,red、green和blue分别为红、绿、蓝的亮度,alpha为透明度,取值均为0.0~1.0。

在该函数之后绘制的所有物体都将使用该颜色。

(1)光线:OpenGL的光照模型中将光源分成四种:发射光:一个物体本身就是一个发光源,如太阳、电灯等,这种光不受其它任何光源的影响。

环境光:从光源出发后光线被环境多次反射,以致没有明确的方向,或者说来自于所有的方向。

被环境光照射的物体,各个表面都均等受光。

散射光:来自于某个方向,被物体表面均匀地反射,例如荧光照明、窗口射入的阳光等。

镜面光:来自于一个方向,被物体强烈地反射到另一个特定的方向。

高亮度的镜面光往往能在被照射的物体表面产生亮斑,如金属球上的高光区。

对于散射光和镜面光,入射角度、距离和衰减因子还会影响到最终的光照效果。

除了物体本身的发射光以外,通常意义上的光并不会是单纯的环境光、散射光或镜面光,而是由这三种类型的光混合组成的。

在OpenGL中,光也是采用RGBA值来定义的,分别描述光线中红绿蓝各成分的相对亮度。

OpenGL中的光照模型

OpenGL中的光照模型

OpenGL中的光照模型一、OpenGL的光照模型在OpenGL的简单光照模型中反射光可以分成三个分量,环境反射光(Ambient Light)、漫反射光(Diffuse Light)和镜面反射光(Specular Light):a、环境光Ambient,是由光源发出经环境多次散射而无法确定其入射方向的光,即似乎来自所有方向。

当环境光照到曲面上时,它在各个方向上均等地发散(类似于无影灯光)。

特征:入射方向和出射方向均为任意方向。

b、漫射光Diffuse,来自特定方向,它垂直于物体时比倾斜时更明亮。

一旦它照射到物体上,则在各个方向上均匀地发散出去,效果为无论视点在哪里它都一样亮。

特征:入射方向唯一、出射方向为任意方向。

c、镜面光Specular,来自特定方向并沿另一方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射。

特征:入射方向和出射方向均唯一。

二、创建光源定义光源特性的函数:glLight*(light , pname, param)其中第一个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7;第二个参数pname指定光源特性,这个参数的辅助信息见表1所示;最GL_LIGHT0,其他几个光源的GL_DIFFUSE和GL_SPECULAR缺省值为(0.0,0.0,0.0,1.0)。

三、启用光源和明暗处理如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算。

要启用光照或关闭光照,调用函数:glEnable(GL_LIGHTING) 或glDisable(GL_LIGHTING)。

启用光照后必须调用函数glEnable(GL_LIGHT0) ,使所定义的光源有效。

其它光源类似,只是光源号不同而已。

在OpenGL中,用单一颜色处理的称为平面明暗处理(Flat Shading),用许多不同颜色处理的称为光滑明暗处理(Smooth Shading),也称为Gourand明暗处理(Gourand Shading)。

浅谈OpenGL中的光照技术

浅谈OpenGL中的光照技术

浅谈OpenGL中的光照技术下面的这边文章,让我对OpenGL中的光照有了新的认识OpenGL场景中模型颜色的产生,大致为如下的流程图所描述:(1)当不开启光照时,使用顶点颜色来产生整个表面的颜色。

用glShadeModel可以设置表面内部像素颜色产生的方式。

GL_FLAT/GL_SMOOTH.(2)一般而言,开启光照后,在场景中至少需要有一个光源(GL_LIGHT0.。

.GL_LIGHT7)通过glEnable(GL_LIGHT0)glDisable(GL_LIGHT0)来开启和关闭指定的光源。

--- 全局环境光---GLfloat gAmbient[]= {0.6,0,6,0,6,1.0};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,gAmbient);(3)设置光源的光分量-- 环境光/漫色光/镜面光默认情况下,GL_LIGHT0.。

.GL_LIGHT7 的GL_AMBIENT值为(0.0,0.0,0.0,1.0); GL_LIGHT0的GL_DIFFUSE和GL_SPECULAR值为(1.0,1.0,1.0,1.0),GL_LIGHT1.。

.GL_LIGHT7 的GL_DIFFUSE和GL_SPECULAR值为(0.0,0.0,0.0,0.0)。

GLfloat lightAmbient[]= {1.0,1.0,1.0,1.0};GLfloat lightDiffuse[]= {1.0,1.0,1.0,1.0};GLfloat lightSpecular[]= {0.5,0.5,0.5,1.0};glLightfv(GL_LIGHT0,GL_AMBIENT,lightAmbient);glLightfv(GL_LIGHT0,GL_DIFFUSE,lightDiffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,lightSpecular);(4)设置光源的位置和方向-- 平行光-- 没有位置只有方向GLfloat lightPosiTIon[]= {8.5,5.0,-2.0,0.0}; // w=0.0glLightfv(GL_LIGHT0,GL_POSITION,lightPosiTIon);-- 点光源-- 有位置没有方向GLfloat lightPosiTIon[]= {8.5,5.0,-2.0,1.0}; // w不为0glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);-- 聚光灯-- 有位置有方向GLfloat lightPosition[]= {-6.0,1.0,3.0,1.0}; // w不为0glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);GLfloat lightDirection[]= {1.0,1.0,0.0};glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,lightDirection); // 聚光灯主轴方向spot directionglLightf(GL_LIGHT0,GL_SPOT_CUTOFF,45.0); // cutoff角度spot cutoff** 平行光不会随着距离d增加而衰减,但点光源和聚光灯会发生衰减。

opengl光照模型实现课程设计

opengl光照模型实现课程设计

opengl光照模型实现课程设计一、课程目标知识目标:1. 让学生掌握OpenGL中光照模型的基本概念和原理,包括环境光、散射光、镜面光等;2. 使学生了解并掌握OpenGL中实现光照效果的常用函数和技巧;3. 让学生掌握如何使用光照模型为三维场景添加真实感。

技能目标:1. 培养学生运用OpenGL库进行三维场景光照编程的能力;2. 培养学生通过调整光照参数,优化场景光照效果的能力;3. 培养学生运用光照模型解决实际场景渲染问题的能力。

情感态度价值观目标:1. 培养学生对计算机图形学及三维渲染技术的兴趣和热情;2. 培养学生具备团队协作精神,学会在项目实践中互相交流、分享经验;3. 培养学生关注科技发展,了解计算机图形学在现实生活和产业中的应用。

课程性质分析:本课程为计算机图形学相关课程,旨在让学生掌握OpenGL光照模型的应用,提高三维场景渲染的真实感。

学生特点分析:学生具备一定的编程基础和图形学知识,对OpenGL有一定了解,但对光照模型的应用尚不熟悉。

教学要求:1. 理论与实践相结合,注重学生动手实践能力的培养;2. 结合实际案例,引导学生运用所学知识解决实际问题;3. 注重培养学生的团队协作和沟通能力。

二、教学内容1. 光照模型基本原理:包括环境光、散射光、镜面光的产生和计算方法,以及光照模型的组成要素。

- 教材章节:第三章“光照模型基础”2. OpenGL光照函数:介绍OpenGL中实现光照效果的相关函数,如glEnable(GL_LIGHTING)、glLightfv等。

- 教材章节:第四章“OpenGL光照函数”3. 光照参数设置:讲解如何设置光照参数,包括光源位置、颜色、强度等,以及材质属性。

- 教材章节:第五章“光照参数设置”4. 光照效果优化:分析如何通过调整光照参数,优化三维场景的光照效果,提高真实感。

- 教材章节:第六章“光照效果优化”5. 实践案例:结合实际项目,运用光照模型为三维场景添加光照效果,培养学生的实际操作能力。

OpenGL光源光照使用范例

OpenGL光源光照使用范例

OpenGL光源光照使用范例2011-04-30 22:37:33| 分类:默认分类| 标签:opengl |字号大中小订阅1. 光照模型环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失.全局环境光——每个光源都能对场景提供环境光。

此外,还有一个环境光,它不来自任何特定的光源,称之为全局环境光。

这也就是为什么我们不加任何自定义光源,也能看见绘制的物体的原因。

散射光——来自同一方向,照射到物体表面后,将沿各个方向均匀反射,因此,无论从哪个方向观察,表面的亮度都相同. 主要通过设置GLfloat light_diffuse[] = { 0.0, 1.0, 0.0, 1.0 }来发射绿光镜面反射光——来自特定方向,也被反射到特定方向.镜面反射度与之相关.材质发射光——用于模拟发光物体.在OpenGL光照模型中,表面的发射光增加了物体的亮度,它不受光源的影响,另外,发射光不会给整个场景中增加光线.当光照射到一个物体表面上时,会出现三种情形。

首先,光可以通过物体表面向空间反射,产生反射光。

其次,对于透明体,光可以穿透该物体并从另一端射出,产生透射光。

最后,部分光将被物体表面吸收而转换成热。

在上述三部分光中,仅仅是透射光和反射光能够进入人眼产生视觉效果。

这里介绍的简单光照模型只考虑被照明物体表面的反射光影响,假定物体表面光滑不透明且由理想材料构成,环境假设为由白光照明。

一般来说,反射光可以分成三个分量,即环境反射、漫反射和镜面反射。

环境反射分量假定入射光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去,通常物体表面还会受到从周围环境来的反射光(如来自地面、天空、墙壁等的反射光)的照射,这些光常统称为环境光(Ambient Light);漫反射分量表示特定光源在景物表面的反射光中那些向空间各方向均匀反射出去的光,这些光常称为漫射光(Diffuse Light);镜面反射光为朝一定方向的反射光,如一个点光源照射一个金属球时会在球面上形成一块特别亮的区域,呈现所谓“高光(Highlight)”,它是光源在金属球面上产生的镜面反射光(Specular Light)。

使用open GL在绘制球体的基础上增加光照和材质设置

使用open GL在绘制球体的基础上增加光照和材质设置

(计算机图形学)实验报告实验名称使用open GL在绘制球体的基础上增加光照和材质设置实验时间年月日专业班级学号:姓名:成绩教师评语:一、实验目的1、了解并学习open GL的编程;2、掌握在open GL生成图形的基本思想和基本步骤;3、使用open GL具体生成简单的三维立体图形;4、在生成的三维立体的图形上面增加光照和材质的设置。

二、实验原理在上一个实验的基础上,对绘制出来的球体进行光照和材质的设置使其看起来更有立体感,其中对我们有以下几条要求:1、理解环境光,漫反射光和镜面反射光的光照模型2、理解phong光照模型,熟练掌握opengl中设置光照的方法3、掌握材质的设置方式一.材质的指定材质和灯光一样有三种属性:环境属性,漫反射属性和镜面反射属性,这些属性确定了材质反射灯光的多少。

设置材质和设置光照很相似,设置材质的函数是glMaterial*()glMaterial{if}v(face, pname, value)face :指明对物体的哪些面进行材质设置GL_FRONTGL_BACKGL_FRONT_AND_BACKPname:要设置的材质属性GL_AMBIENT 设置材料的环境颜色GL_DIFFUSE 设置材料的漫反射颜色GL_SPECULAR 设置材料的镜面反射颜色GL_AMIBIENT_AND_DIFFUSE 设置材料的环境和漫反射颜色GL_SHININESS 设置镜面指数GL_EMISSION 设置材料的发散颜色GL_COLOR_INDEXES 设置环境,漫反射和镜面反射的颜色索引1.通常,GL_AMBIENT 和GL_DIFFUSE 都取相同的值,可以达到比较真实的效果。

使用GL_AMBIENT_AND_DIFFUSE 可以同时设置 GL_AMBIENT 和 GL_DIFFUSE属性。

2.GL_SHININESS属性。

该属性只有一个值,称为“镜面指数”,取值范围是 0到128。

OpenGL新手入门实验4

OpenGL新手入门实验4

实验4:绘制立方体或者球,通过菜单控制绘制的物体,并添加对话框控制光照和材质参数。

实验要求:熟练菜单及其响应,对话框的添加及数据的传递过程,理解材质和光照对三维图形绘制的影响。

1、修改菜单,添加“选择”和“参数”一级菜单,再添加在“选择”一级菜单下添加二级菜单“立方体”(IDM_CUBE)和“球”(IDM_SPHERE)在“参数”下添加“材质”(IDM_MATERIAL)和“光源”(IDM_LIGHT)两个二级菜单2、添加对话框“材质”(IDD_ MA TERIAL),添加如图所示的静态框、复选框及按钮,CTRL+T 可以查看对话框效果。

添加对话框“光源”(IDD_LIGHT),添加如图所示的静态框、复选框及按钮,CTRL+T可以查看对话框效果。

3、创建对话框类CLighting和CLightMaterial,利用classwizard添加相应的成员变量。

CLighting类成员变量:float m_lightAmbientB;//环境关照的变量float m_lightAmbientG;float m_lightAmbientR;float m_lightDiffuseB;//漫反射关照变量float m_lightDiffuseG;float m_lightDiffuseR;float m_lightPositionX;//坐标float m_lightPositionY;float m_lightPositionZ;float m_lightSpecularB;//镜面反射变量float m_lightSpecularG;float m_lightSpecularR;BOOL m_bConstant;float m_spotDirectionX;//坐标float m_spotDirectionY;float m_spotDirectionZ;float m_spotAmbientB;//环境光照变量float m_spotAmbientG;float m_spotAmbientR;float m_spotDiffuseB;//漫反射光照变量float m_spotDiffuseG;float m_spotDiffuseR;BOOL m_bLinear;BOOL m_bspotOnOff;float m_spotPositionX;float m_spotPositionY;float m_spotPositionZ;BOOL m_bQuadratic;float m_spotSpecularB;//镜面反射光变量float m_spotSpecularG;float m_spotSpecularR;float m_spotCutoff;CLightMaterial类成员变量:float m_matAmbientB;float m_matAmbientG;float m_matAmbientR;float m_matDiffuseB;float m_matDiffuseG;float m_matDiffuseR;float m_matEmissionB;float m_matEmissionG;float m_matEmissionR;float m_matShininess;float m_matSpecularB;float m_matSpecularG;float m_matSpecularR;BOOL m_bMaterialFlag;4、添加CMyOpenGLView类的int m_selectObject; enum {Cube,Sphere};并初始化m_selectObject=Sphere;5、添加CMyOpenGLView类关于光照和材质的成员变量GLfloat m_lightAmb[4];GLfloat m_lightDif[4];GLfloat m_lightSpe[4];GLfloat m_lightPos[4];GLfloat m_materialAmb[4];GLfloat m_materialDif[4];GLfloat m_materialSpe[4];GLfloat m_materialEmi[4];GLfloat m_matShininess;BOOL m_bMaterial;GLfloat m_spotAmb[4];GLfloat m_spotDif[4];GLfloat m_spotSpe[4];GLfloat m_spotPos[4];GLfloat m_spotDir[4];GLfloat m_spotCutoff;BOOL m_bConstant;BOOL m_bLinear;BOOL m_bQuadratic;BOOL m_bspotOnOff;并初始化m_lightAmb[0]=0.2f; m_lightAmb[1]=0.2f;m_lightAmb[2]=0.2f; m_lightAmb[3]=1.0f;m_lightDif[0]=1.0f; m_lightDif[1]=1.0f;m_lightDif[2]=0.3f; m_lightDif[3]=1.0f;m_lightSpe[0]=1.0f; m_lightSpe[1]=1.0f;m_lightSpe[2]=1.0f; m_lightSpe[3]=1.0f;m_lightPos[0]=1.0f; m_lightPos[1]=1.0f;m_lightPos[2]=1.0f; m_lightPos[3]=0.0f;m_materialAmb[0]=0.2f; m_materialAmb[1]=0.2f;m_materialAmb[2]=0.2f; m_materialAmb[3]=1.0f;m_materialDif[0]=0.8f; m_materialDif[1]=0.8f;m_materialDif[2]=0.8f; m_materialDif[3]=1.0f;m_materialSpe[0]=0.0f; m_materialSpe[1]=0.0f;m_materialSpe[2]=0.0f; m_materialSpe[3]=1.0f;m_materialEmi[0]=0.0f; m_materialEmi[1]=0.0f;m_materialEmi[2]=0.0f; m_materialEmi[3]=1.0f;m_matShininess=0.0f;m_bMaterial=TRUE;m_spotAmb[0]=0.2f; m_spotAmb[1]=0.2f;m_spotAmb[2]=0.2f; m_spotAmb[3]=1.0f;m_spotDif[0]=0.0f; m_spotDif[1]=1.0f;m_spotDif[2]=1.0f; m_spotDif[3]=1.0f;m_spotSpe[0]=0.6f; m_spotSpe[1]=0.6f;m_spotSpe[2]=0.6f; m_spotSpe[3]=1.0f;m_spotPos[0]=-1.0f; m_spotPos[1]=0.0f;m_spotPos[2]=1.0f; m_spotPos[3]=1.0f;m_spotDir[0]=1.0f; m_spotDir[1]=0.0f;m_spotDir[2]=-1.0f; m_spotDir[3]=1.0f;m_spotCutoff=40.0f;m_bConstant = FALSE;m_bLinear = FALSE;m_bQuadratic = FALSE;m_bspotOnOff=TRUE;6、添加IDM_LIGHT的消息映射函数COMMAND,打开IDM_LIGHT并交换数据void CMyOpenGLView::OnLight(){// TODO: Add your command handler code hereCLighting lightDlg;lightDlg.m_lightAmbientR=m_lightAmb[0];lightDlg.m_lightAmbientG=m_lightAmb[1];lightDlg.m_lightAmbientB=m_lightAmb[2];lightDlg.m_lightDiffuseR=m_lightDif[0];lightDlg.m_lightDiffuseG=m_lightDif[1];lightDlg.m_lightDiffuseB=m_lightDif[2];lightDlg.m_lightSpecularR=m_lightSpe[0];lightDlg.m_lightSpecularG=m_lightSpe[1]; lightDlg.m_lightSpecularB=m_lightSpe[2];lightDlg.m_lightPositionX=m_lightPos[0]; lightDlg.m_lightPositionY=m_lightPos[1]; lightDlg.m_lightPositionZ=m_lightPos[2];/////////SpotlightDlg.m_spotAmbientR=m_spotAmb[0]; lightDlg.m_spotAmbientG=m_spotAmb[1]; lightDlg.m_spotAmbientB=m_spotAmb[2];lightDlg.m_spotDiffuseR=m_spotDif[0]; lightDlg.m_spotDiffuseG=m_spotDif[1]; lightDlg.m_spotDiffuseB=m_spotDif[2];lightDlg.m_spotSpecularR=m_spotSpe[0]; lightDlg.m_spotSpecularG=m_spotSpe[1]; lightDlg.m_spotSpecularB=m_spotSpe[2];lightDlg.m_spotPositionX=m_spotPos[0]; lightDlg.m_spotPositionY=m_spotPos[1]; lightDlg.m_spotPositionZ=m_spotPos[2];lightDlg.m_spotDirectionX=m_spotDir[0]; lightDlg.m_spotDirectionY=m_spotDir[1]; lightDlg.m_spotDirectionZ=m_spotDir[2];lightDlg.m_spotCutoff=m_spotCutoff;lightDlg.m_bConstant=m_bConstant; lightDlg.m_bLinear=m_bLinear;lightDlg.m_bQuadratic=m_bQuadratic; lightDlg.m_bspotOnOff=m_bspotOnOff;if(lightDlg.DoModal()==IDOK){m_lightAmb[0]=lightDlg.m_lightAmbientR;m_lightAmb[1]=lightDlg.m_lightAmbientG;m_lightAmb[2]=lightDlg.m_lightAmbientB;m_lightDif[0]=lightDlg.m_lightDiffuseR;m_lightDif[1]=lightDlg.m_lightDiffuseG;m_lightDif[2]=lightDlg.m_lightDiffuseB;m_lightSpe[0]=lightDlg.m_lightSpecularR;m_lightSpe[1]=lightDlg.m_lightSpecularG;m_lightSpe[2]=lightDlg.m_lightSpecularB;m_lightPos[0]=lightDlg.m_lightPositionX;m_lightPos[1]=lightDlg.m_lightPositionY;m_lightPos[2]=lightDlg.m_lightPositionZ;//////////Spotm_spotAmb[0]=lightDlg.m_spotAmbientR;m_spotAmb[1]=lightDlg.m_spotAmbientG;m_spotAmb[2]=lightDlg.m_spotAmbientB;m_spotDif[0]=lightDlg.m_spotDiffuseR;m_spotDif[1]=lightDlg.m_spotDiffuseG;m_spotDif[2]=lightDlg.m_spotDiffuseB;m_spotSpe[0]=lightDlg.m_spotSpecularR;m_spotSpe[1]=lightDlg.m_spotSpecularG;m_spotSpe[2]=lightDlg.m_spotSpecularB;m_spotPos[0]=lightDlg.m_spotPositionX;m_spotPos[1]=lightDlg.m_spotPositionY;m_spotPos[2]=lightDlg.m_spotPositionZ;m_spotDir[0]=lightDlg.m_spotDirectionX;m_spotDir[1]=lightDlg.m_spotDirectionY;m_spotDir[2]=lightDlg.m_spotDirectionZ;m_spotCutoff=lightDlg.m_spotCutoff;m_bConstant=lightDlg.m_bConstant;m_bLinear=lightDlg.m_bLinear;m_bQuadratic=lightDlg.m_bQuadratic;m_bspotOnOff=lightDlg.m_bspotOnOff;Invalidate();}}注意,不要忘了引用Lighting.h文件#include "Lighting.h"7、添加IDM_ MATERIAL的消息映射函数COMMAND,并void CMyOpenGLView::OnMaterial(){// TODO: Add your command handler code here CLightMaterial dlg;//材质dlg.m_matAmbientR=m_materialAmb[0];dlg.m_matAmbientG=m_materialAmb[1];dlg.m_matAmbientB=m_materialAmb[2];dlg.m_matDiffuseR=m_materialDif[0];dlg.m_matDiffuseG=m_materialDif[1];dlg.m_matDiffuseB=m_materialDif[2];dlg.m_matSpecularR=m_materialSpe[0];dlg.m_matSpecularG=m_materialSpe[1];dlg.m_matSpecularB=m_materialSpe[2];dlg.m_matEmissionR=m_materialEmi[0];dlg.m_matEmissionG=m_materialEmi[1];dlg.m_matEmissionB=m_materialEmi[2];dlg.m_matShininess= m_matShininess;dlg.m_bMaterialFlag=m_bMaterial;int responeDlg=dlg.DoModal();if(responeDlg == IDOK){m_materialAmb[0]=dlg.m_matAmbientR;m_materialAmb[1]=dlg.m_matAmbientG;m_materialAmb[2]=dlg.m_matAmbientB;m_materialDif[0]=dlg.m_matDiffuseR;m_materialDif[1]=dlg.m_matDiffuseG;m_materialDif[2]=dlg.m_matDiffuseB;m_materialSpe[0]=dlg.m_matSpecularR;m_materialSpe[1]=dlg.m_matSpecularG;m_materialSpe[2]=dlg.m_matSpecularB;m_materialEmi[0]=dlg.m_matEmissionR;m_materialEmi[1]=dlg.m_matEmissionG;m_materialEmi[2]=dlg.m_matEmissionB;m_matShininess=dlg.m_matShininess;m_bMaterial=dlg.m_bMaterialFlag;Invalidate();}}注意,不要忘了引用LightMaterial.h文件#include " LightMaterial.h"8、添加IDM_CUBE的消息映射函数COMMAND和UPDATE_COMMAND_UIvoid CMyOpenGLView::OnCube(){// TODO: Add your command handler code herem_selectObject=Cube;Invalidate();}void CMyOpenGLView::OnUpdateCube(CCmdUI* pCmdUI){// TODO: Add your command update UI handler code hereif( m_selectObject == Cube)pCmdUI->SetCheck(TRUE);elsepCmdUI->SetCheck(FALSE);}同样添加IDM_SPHERE的void CMyOpenGLView::OnSphere(){// TODO: Add your command handler code herem_selectObject=Sphere;Invalidate();}void CMyOpenGLView::OnUpdateSphere(CCmdUI* pCmdUI){// TODO: Add your command update UI handler code hereif( m_selectObject == Sphere)pCmdUI->SetCheck(TRUE);elsepCmdUI->SetCheck(FALSE);}9、打开深度测试,在gl_Init()函数中添加以下语句glEnable(GL_DEPTH_TEST); //实际就是消隐,可以测试不加的时候会出现什么情况=================================================================== 10、添加创建灯光的函数CreateLights(),完成灯光的设置11、添加创建材质的函数CreateMaterial(),完成材质的设置12、添加绘制立方体的函数DrawCube(),注意需要计算各个面的法向量,可以使用CalculateNormal函数计算13、添加绘制球的函数DrawSphere()void CMyOpenGLView::DrawSphere(){GLUquadricObj* quadObj;glNewList(1,GL_COMPILE);quadObj=gluNewQuadric();gluQuadricDrawStyle(quadObj,GLU_FILL);gluQuadricNormals(quadObj,GLU_SMOOTH);gluSphere(quadObj,0.7,32,32);glEndList();glCallList(1);}14、修改DrawScene()函数,调用CreateLights()和CreateMaterial(),添加绘制语句。

OpenGL光照和材质

OpenGL光照和材质

OpenGL 的光照和材质
3 设置光线衰减系数(这些属性只对位置性光源有效)
glLightf(GL_LIGHT0,AttenuationWay,SpotAttenuation); AttenuationWay可以取以下几个值: GL_CONSTANT_ATTENUATION -- 表示光线按常熟衰减(与距离无关) GL_LINEAR_ATTENUATION -- 表示光线按距离线性衰减 GL_QUADRATIC_ATTENUATION -- 表示光线按距离以二次函数衰减。 参数 SpotAttenuation为光线的衰减系数。 GL_CONSTANT_ATTENUATION、GL_LINEAR_ATTENUATION、 GL_QUADRATIC_ATTENUATION属性。这三个属性表示了光源所发出的光 线的直线传播特性。现实生活中,光线的强度随着距离的增加而减弱, OpenGL把这个减弱的趋势抽象成函数: 衰减因子 = 1 / (k1 + k2 * d + k3 * k3 * d) 其中d表示距离,光线的初始强度乘以衰减因子,就得到对应距离的光线强度。 k1, k2, k3分别是 GL_CONSTANT_ATTENUATION,GL_LINEAR_ATTENUATION,GL_QUADR ATIC_ATTENUATION。通过设置这三个常数,就可以控制光线在传播过程中 的减弱趋势。
OpenGL 的光照和材质
5 设置材质: OpenGL 用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。象光 源一样,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境 光、漫反射光和镜面反射光的反射程度。在进行光照计算时,材料对环境光的反 射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的漫反 射光结合,对镜面光的反射率与每个进入光源的镜面反射光结合。对环境光与漫 反射光的反射程度决定了材料的颜色,并且它们很相似。对镜面反射光的反射率 通常是白色或灰色(即对镜面反射光中红、绿、蓝的反射率相同)。镜面反射高 光最亮的地方将变成具有光源镜面光强度的颜色。例如一个光亮的红色塑料球, 球的大部分表现为红色,光亮的高光将是白色的材质的颜色与光源的颜色有些不 同。对于光源,R、G、B 值等于R、G、B 对其最大强度的百分比。若光源颜色 的R、G、B 值都是1.0,则是最强的白光;若值变为0.5,颜色仍为白色,但强度 为原来的一半,于是表现为灰色;若R=G=1.0,B=0.0,则光源为黄色。对于 材质,R、G、B 值为材质对光的R、G、B 成分的反射率。比如,一种材质的R= 1.0、G=0.5、B=0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝 色成分。也就是说,若OpenGL 的光源颜色为(LR、LG、LB),材质颜色为 (MR、MG、MB),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的 光的颜色为(LR*MR、LG*MG、LB*MB)指定了图元的法线之后,我们还需要为 其指定相应的材质以决定物体对各种颜色的光的反射程度,这将影响物体表现为 何种颜色指定材质

OpenGL(四)之颜色篇

OpenGL(四)之颜色篇

OpenGL(四)之颜⾊篇本次学习的是颜⾊的选择。

终于要⾛出⿊⽩的世界了~~OpenGL⽀持两种颜⾊模式:⼀种是RGBA,⼀种是颜⾊索引模式。

⽆论哪种颜⾊模式,计算机都必须为每⼀个像素保存⼀些数据。

不同的是,RGBA模式中,数据直接就代表了颜⾊;⽽颜⾊索引模式中,数据代表的是⼀个索引,要得到真正的颜⾊,还必须去查索引表。

1. RGBA颜⾊RGBA模式中,每⼀个像素会保存以下数据:R值(红⾊分量)、G值(绿⾊分量)、B值(蓝⾊分量)和A值(alpha分量)。

其中红、绿、蓝三种颜⾊相组合,就可以得到我们所需要的各种颜⾊,⽽alpha不直接影响颜⾊,它将留待以后介绍。

在RGBA模式下选择颜⾊是⼗分简单的事情,只需要⼀个函数就可以搞定。

glColor*系列函数可以⽤于设置颜⾊,其中三个参数的版本可以指定R、G、B的值,⽽A值采⽤默认;四个参数的版本可以分别指定R、G、B、A的值。

例如:void glColor3f(GLfloat red, GLfloat green, GLfloat blue);void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);(还记得吗?3f表⽰有三个浮点参数~请看第⼆课中关于glVertex*函数的叙述。

)将浮点数作为参数,其中0.0表⽰不使⽤该种颜⾊,⽽1.0表⽰将该种颜⾊⽤到最多。

例如:glColor3f(1.0f, 0.0f, 0.0f); 表⽰不使⽤绿、蓝⾊,⽽将红⾊使⽤最多,于是得到最纯净的红⾊。

glColor3f(0.0f, 1.0f, 1.0f); 表⽰使⽤绿、蓝⾊到最多,⽽不使⽤红⾊。

混合的效果就是浅蓝⾊。

glColor3f(0.5f, 0.5f, 0.5f); 表⽰各种颜⾊使⽤⼀半,效果为灰⾊。

注意:浮点数可以精确到⼩数点后若⼲位,这并不表⽰计算机就可以显⽰如此多种颜⾊。

Opengl实验报告及源代码实验六 颜色与光照

Opengl实验报告及源代码实验六  颜色与光照

南昌大学实验报告学生姓名:学号:专业班级:实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:一、实验名称实验六颜色与光照二、实验内容1.指定几何模型的绘制颜色,使用平滑着色模式用多种不同的颜色绘制多边形;2.通过定义光源、材质和光照模型属性渲染物体的光照效果;3.创建一个3D虚拟场景,利用定向光、点光源和聚光灯等不同光源实现3D场景的光照效果。

三、实验目的1.了解RGBA颜色的实现原理,掌握利用Flat和Smooth着色模式来绘制不同颜色的物体的方法;2.掌握OpenGL光照模型,理解光源、材质和光照模型如何综合影响物体的光照效果。

3.掌握定向光、点光源和聚光灯的不同属性及三种光源光照效果的计算方法。

四、实验步骤1.建立立方体几何模型。

定义立方体顶点的位置坐标和纹理坐标,设置不同立方体在世界坐标系中的位置:// Set up vertex data (and buffer(s)) and attribute pointersGLfloat vertices[] = {// Positions // Normals // Texture Coords-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f };// Positions all containersglm::vec3 cubePositions[] = {glm::vec3(0.0f, 0.0f, 0.0f),glm::vec3(2.0f, 5.0f, -15.0f),glm::vec3(-1.5f, -2.2f, -2.5f),glm::vec3(-3.8f, -2.0f, -12.3f),glm::vec3(2.4f, -0.4f, -3.5f),glm::vec3(-1.7f, 3.0f, -7.5f),glm::vec3(1.3f, -2.0f, -2.5f),glm::vec3(1.5f, 2.0f, -2.5f),glm::vec3(1.5f, 0.2f, -1.5f),glm::vec3(-1.3f, 1.0f, -1.5f)};2.加载立方体模型的顶点数据。

第四章 光照与材质

第四章 光照与材质
光的成分 材料颜色 光和材料的RGB值
在OpenGL光照模型中: 假定可以将光分解成红,绿,蓝三种成分 光源颜色的特征:由它所发射的红,绿, 蓝光的数量决定 表面材料的特征:由它从各个方向所反射 的入射红,绿,蓝光成分的百分比决定
1.1 光的成分
在OpenGL光照模型中: 把光分成四种独立的成分: 1)环境光 2)散射光 3)镜面光 4)发射光 四种成分可单独计算,并叠加在一起
1 衰 因 = 减 子 kc + ki d + kqd 2
聚光灯
聚光灯:对位置性光源加以限制,使它的 发射范围限制在一个椎体之内
GL_SPOT_CUTOFF
【步骤】 1)使用GL_SPOT_CUTOFF指定光锥轴和光锥边缘的 角度,取值范围为[0.0,90.0] 例: glLightf(GL_LIGHT0, GL_SPOT_CUTOFF,45.0) 2)使用GL_SPOT_DIRECTION指定聚光灯方向,以 确定光锥的轴线方向 例: GLfloat spot_direction[] = {-1.0,-1.0,0.0}; glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction)
第四章 光照与材质
邱航 qiuhang@ 电子科技大学计算机科学与工程学院 电子科技大学数字媒体技术研究所
本章内容
第一节 OpenGL光照模型 第二节 法线向量 第三节 创建光源 第四节 选择光照模型 第五节 定义材料属性
第一节 OpenGL光照模型 OpenGL光照模型
3)使用GL_SPOT_EXPONENT设置聚光指数,聚 光指数控制光的集中程度,光锥中心的光强最大, 越靠边的光强越小,默认为0 ,均匀照射. 例:glLightf(GL_LIGHT0, GL_SPOT_EXPONENT,2.0)

OPENGL-第4章颜色光照和材质

OPENGL-第4章颜色光照和材质

例子: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:在指定的位置
glColor3f(.75,.75,.75);
glBeigin(GL_TRIANGLE); … 方法2的优点是:可以直接用颜色设定 glEnd();
显示的颜色,符合习惯
例子:sphere1
直接用颜色参数
Opengl编程过程总结
• 初始化
–…
• 对每个场景:
– 建立相机 …
• 对每个光源 …
– glLight(...) – 设定光源参数
• 或:
• 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 :指定位置的光:
• 反射光:
– 环境光:光来自各个方向,以各方向反射出去 – 漫反射光::光来自某个方向,均匀反射出去 – 镜面反射光:光来自某个方向,以特定方向反射 出去
glBeigin(GL_TRIANGLE);
… glEnd();
例子:sphere
物体的哪个面,光 反射类型 光反射的成分
材质函数-方法2
• 颜色跟踪法
用glColor设 置材质属性
glEnable(GL_COLOR_MATERIAL); //激活颜色属性
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 的颜色,即同一颜色。
相关文档
最新文档