OpenGL中的颜色光照和材质
定义光照属性值,分别用数组表示:
float lightAmbient[] = { 0.2f, 0.0f, 0.0f, 1.0f };
//定义一个数组,表示整个光照环境,有4个值,分别表示光源中含有 红、绿、蓝三种光线的成分 ,第四个参数为透明度值,一般也为1。
float lightDiffuse[] = { 0.5f, 0.0f, 0.0f, 1.0f };
OpenGL 中的颜色、光照和材质
简单光照 OpenGL简单光照光源 分为:
简单光照 OpenGL简单光照光源分为: 辐射光(Emitted Light)是最简单的一种光,它直接从 物体发出并且不受任何光源影响。 环境光(Ambient Light)是由光源发出经环境多次散射 而无法确定其方向的光,即似乎来自所有方向。 漫射光(Diffuse Light)来自一个方向,它垂直于物体时 比倾斜时更明亮。 镜面光(Specular Light)来自特定方向并沿另一方向反 射出去。
(2)GL_POSITION属性。
表示光源所在的位置。由四个值(X, Y, Z, W)表示。 如果第四个值W为零,则表示该光源位于无限远处, 前三个值表示了它所在的方向。这种光源称为方向性 光源,通常,太阳可以近似的被认为是方向性光源。 如果第四个值W不为零,则X/W, Y/W, Z/W表示了光 源的位置。这种光源称为位置性光源。
实例:二次曲面物体光照与材质
步骤1:设置光照 基础知识
创建光源 光源有许多特性,如颜色、位置、方向等。 设置光源特性参数的函数: void glLight{if}[v]( GLenum light , GLenum pname , TYPE param ) 参数light指定所创建的光源号,如 GL_LIGHT0 , GL_LIGHT1 ,GL_LIGHT2 ... ... 参数pname指定光源特性 参数param设置相应光源特性值
GL_LIGHT0进行设置,第二个参数表示要设置的是漫反射光成分,第三个参 数则是一个数组(表示光照属性值)
//设置在场景照射到粗糙表面时经过漫反射光。第一个参数表示是对第0号光源
glLightfv(GL_LIGHT0,GL_POSITION,light_position); //设置光源的位置,第三个参数则是一个数组(表示光源的位置值)
(1)GL_AMBIENT、GL_DIFFUSE、 GL_SPECULAR属性。
这三个属性表示了光源所发出的光的反射特性(以及颜色)。 每个属性由四个值表示,分别代表了颜色的R, G, B, A值。 GL_AMBIENT表示该光源所发出的光,经过非常多次的反射后, 最终在整个光照环境中的强度(颜色)。GL_DIFFUSE表示该 光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光 的强度(颜色)。GL_SPECULAR表示该光源所发出的光,照 射到光滑表面时经过镜面反射,所得到的光的强度(颜色)。
步骤1:设置光照:glLightfv
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
表示要设置的是环境光成分,第三个参数则是一个数组(表示光照属性值)
//设置场景的环境光。第一个参数表示是对第0号光源GL_LIGHT0进行设置,第二个参数
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
//定义数组,用来表示光源的漫反射.
Hale Waihona Puke float lightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };//
//定义数组,用来表示光源的镜面反射
光源知识:
每一个光源都可以设置其属性,这一动作是通 过glLight*函数完成的。 glLight*函数具有三个参数,第一个参数指明 是设置哪一个光源的属性,第二个参数指明是 设置该光源的哪一个属性,第三个参数则是指 明把该属性值设置成多少。 光源的属性众多,下面将分别介绍光源的属性。
向场景中加入光照的步骤如下:
1. 定义所有物体每个顶点的法向量方向。这 些法向量决定了物体表面与光源的相对取向。 2. 建立、选择并放置一个或多个光源。 3. 建立并选择一个光照模型,它决定了全局 环境光照的程度以及视点的有效位置(用于光照计 算)。 4. 定义场景中物体的材质。
向场景中加入光照的步骤(函数):
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光照与材质(二)
第五章光照与材质5.8 全局环境光每个光源可以有自己的环境光,但也可以有不来自于任何光源的环境光,指定环境光的方法是:利用参数GL_LIGHT_MODEL_AMBIENT来调用函数glLightModel*()。
如:float model_ambient[] = { 0.2 , 0.2 , 0.2 , 1.0 };glLightModelfv(GL_LIGHT_MODEL_AMBIENT , model_ambient ) ;上述代码为场景中的物体提供了软弱的白色环境光,所以即使场景中没有任何光源,也可以看到场景中的物体。
【综合示例EP5-5】场景中绘制一组静物模型,然后加入一个简单的光照,先使用光源自己的环境光,再统一使用全局环境光。
代码如下:#include "stdafx.h"int nAngleY=0; // 沿Y轴旋转的角度int nAngleX=0; // 沿X轴旋转的角度int nAngleZ=0; // 沿Z轴旋转的角度void CALLBACK ClockwiseRotateByX(){nAngleX--;}void CALLBACK CounterClockwiseRotateByX(){nAngleX++;}void CALLBACK ClockwiseRotateByZ(){nAngleZ--;}void CALLBACK CounterClockwiseRotateByZ(){nAngleZ++;}void CALLBACK ClockwiseRotateByY()nAngleY--;}void CALLBACK CounterClockwiseRotateByY(){nAngleY++;}void myinit (void){/* 将背景清为白色*/glClearColor (0.0, 0.0,0.0, 1.0);glShadeModel (GL_SMOOTH);GLfloat ambient[] = { 0.5, 0.0, 0.0, 1.0 };GLfloat specular[] = { 1.0, 1.0, 0.0, 1.0 };GLfloat diffuse[] = { 0.5, 0.5, 0.5, 1.0 };GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };GLfloat model_ambient[] = { 0.3, 0.0, 0.3, 1.0 };GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat mat_shininess[] = { 128.0 };glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);glLightfv(GL_LIGHT1, GL_POSITION, light_position);//glLightfv (GL_LIGHT1, GL_AMBIENT, ambient);glLightfv (GL_LIGHT1, GL_SPECULAR, specular);glLightfv (GL_LIGHT1, GL_DIFFUSE, diffuse);// 指定全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient);glEnable(GL_LIGHTING);glEnable(GL_LIGHT1);glDepthFunc(GL_LEQUAL);glEnable(GL_DEPTH_TEST);glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);void CALLBACK reshape(GLsizei w, GLsizei h){if (!h) return;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho (-500.0, 500.0, -500.0*(GLfloat)h/(GLfloat)w,500.0*(GLfloat)h/(GLfloat)w, -500, 500);elseglOrtho (-500.0*(GLfloat)w/(GLfloat)h,500.0*(GLfloat)w/(GLfloat)h, -500.0, 500.0, -500, 500);glMatrixMode(GL_MODELVIEW);}void CALLBACK display(void){glLoadIdentity();glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除背景glRotated(nAngleX,1,0,0);glRotated(nAngleY,0,1,0);glRotated(nAngleZ,0,0,1);glLineStipple(1, 0x3F07); // 指定点划格式glEnable(GL_LINE_STIPPLE); // 进入点划模式glBegin(GL_LINES);// X轴:红glColor3f (1.0, 0, 0);glVertex3d(-490,0,0);glVertex3d(490,0,0);// Y轴:绿glColor3f (0.0, 1.0, 0);glVertex3d(0,-490,0);glVertex3d(0,490,0);// Z轴:蓝glColor3f (0.0, 0.0, 1);glVertex3d(0,0,-490);glVertex3d(0,0,490);glEnd();glDisable(GL_LINE_STIPPLE);//离开点划模式glColor3f (1.0, 0.0, 0);glPushMatrix(); // 车体glTranslatef(0,210,0);auxSolidBox(600, 20, 400);glPopMatrix();glPushMatrix(); // 左前腿glTranslatef(-260,100,180);auxSolidBox(25, 200, 25);glPopMatrix();glPushMatrix(); // 左后腿glTranslatef(-260,100,-180);auxSolidBox(25, 200, 25);glPopMatrix();glPushMatrix(); // 右前腿glTranslatef(260,100,180);auxSolidBox(25, 200, 25);glPopMatrix();glPushMatrix(); // 右后腿glTranslatef(260,100,-180);auxSolidBox(25, 200, 25);glPopMatrix();glPushMatrix(); // 球glTranslatef(-200,260,0);auxSolidSphere(40);glPopMatrix();glPushMatrix(); // 八面体glTranslatef(-200,260,160);auxSolidOctahedron(40);glPopMatrix();glPushMatrix(); // 圆锥体glTranslatef(-60,220,120);glRotatef(-90,1,0,0);auxSolidCone(60, 100);glPopMatrix();glPushMatrix(); //glTranslatef(60,270,0);glRotatef(40,0,1,0);auxSolidTeapot(70);glPopMatrix();glPushMatrix(); //glTranslatef(240,360,0);auxSolidCylinder(40,140);glPopMatrix();auxSwapBuffers();}int _tmain(int argc, _TCHAR* argv[]){auxInitDisplayMode (AUX_DOUBLE | AUX_RGBA);auxInitPosition (0, 0, 1000, 700);auxInitWindow ("全局环境光");myinit ();auxKeyFunc (AUX_LEFT, ClockwiseRotateByY);auxKeyFunc (AUX_RIGHT, CounterClockwiseRotateByY);auxKeyFunc (AUX_UP, ClockwiseRotateByX);auxKeyFunc (AUX_DOWN, CounterClockwiseRotateByX);auxKeyFunc (AUX_D, ClockwiseRotateByZ);auxKeyFunc (AUX_d, ClockwiseRotateByZ);auxKeyFunc (AUX_U, CounterClockwiseRotateByZ);auxKeyFunc (AUX_u, CounterClockwiseRotateByZ);auxReshapeFunc(reshape);//回调函数auxMainLoop(display);return 0;}5.9 近视点和无穷远视点在无穷远点的情况下,场景中所有顶点到视点的方向都相同。
OpenGL之使用光照和材质
使用了光照和材质可以使物体更逼真,具有立体感。
例4就是没有使用光照使呈现在我们眼前的物体茶壶和立方体没有立体感。
例6:绘制三个使用不同材质的球体。
函数myInit中:
·glLight设置光源的参数。
有三个参数,第一个参数指定光照的数目,最大为8。
第二个参数为光照的单值光源参数。
第三个参数为赋给第二个参数的值,本例中即为将light_position的值赋值给GL_POSITION。
display函数中:
·glMaterial为光照模型指定材质参数。
第一个参数为改变材质的面,其值必为GL_FRONT, GL_BACK或GL_FRONT_AND_BACK中的一个。
第二个参数为需要改变的材质参数。
第三个参数为赋给参数二的值或指向值的指针。
本例中均为指针。
·glColorMateria使材质色跟踪当前颜色。
第一个参数指定哪一个面需要使材质色跟踪当前颜色。
第二个参数指定哪个参数需要跟踪颜色。
材质与光照
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)。
环境光Ambient:是由光源发出经环境多次散射⽽⽆法确定其⼊射⽅向的光,即似乎来⾃所有⽅向。
其特征是⼊射⽅向和出射⽅向均为任意⽅向。
漫射光Diffuse:来⾃特定⽅向,它垂直于物体时⽐倾斜时更明亮。
⼀旦它照射到物体上,则在各个⽅向上均匀地发散出去,效果为⽆论视点在哪⾥它都⼀样亮,其特征是⼊射⽅向唯⼀、出射⽅向为任意⽅向。
镜⾯光Specular:来⾃特定⽅向并沿另⼀⽅向反射出去,⼀个平⾏激光束在⾼质量的镜⾯上产⽣100%的镜⾯反射,其特征是⼊射⽅向和出射⽅向均唯⼀。
创建光源OpenGL中⽤函数glLightfv来创建光源,函数原型是:void glLightfv (GLenum light, GLenum pname, const GLfloat *params)第⼀个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7。
第⼆个参数pname指定光源特性,这个参数的具体信息见下表所⽰。
第三个参数设置相应的光源特性值。
例如下边定义了⼀个位置在(0,0,0),没有环境光,镜⾯反射光和漫反射光都为⽩光的光源:GLfloat light_position[] = { 0.0, 0.0, 0.0, 0.0 };GLfloat light_ambient [] = { 0.0, 0.0, 0.0, 1.0 };GLfloat light_diffuse [] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_AMBIENT , light_ambient );glLightfv(GL_LIGHT0, GL_DIFFUSE , light_diffuse );glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);光源的位置坐标采⽤齐次坐标(x, y, z, w)设置。
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场景中模型颜色的产生,大致为如下的流程图所描述:(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光源光照使用范例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在绘制球体的基础上增加光照和材质设置实验时间年月日专业班级学号:姓名:成绩教师评语:一、实验目的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光照和材质
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)指定了图元的法线之后,我们还需要为 其指定相应的材质以决定物体对各种颜色的光的反射程度,这将影响物体表现为 何种颜色指定材质
