第六讲_OpenGL编程技术-光照

合集下载

OpenGL中的光照技术研究

OpenGL中的光照技术研究

OpenGL中的光照技术研究摘要:光照处理是增强图形真实感的重要组成部分,主要研究了如何在场景中添加OpenGL光照,介绍了添加光照的基本步骤以及实现方法,并对如何设置物体的材质属性作了简要介绍。

关键词:光照;真实感;OpenGL;材质0 引言当观察一个物体时,所看到的颜色是基于光子的分布而形成的,正是这些光子刺激了人眼圆锥细胞。

这些光子可能来自单个光源,也可能来自多个光源。

有些光子被表面所吸收,有些光子则被表面所反射。

不同的表面所具有的属性不同。

物体本身如果是用光滑的材质所组成,在此情况下就会反射更多的光,人的眼睛因此也将接受到更多的光子。

如果物体是由粗糙的材质所组成,更多的光子会被其吸收或者被反射出视野之外,因此眼睛就不会接受到很多的光子,物体就会比较暗。

用OpenGL在模拟光照时,通过将光近似地分解成红、绿和蓝色分量来计算光和光照。

也就是说,一个光的颜色由此光中的红、绿和蓝色分量的数量决定。

当光照射到一个表面时,OpenGL根据其表面的材质来确定此表面所应该反射的光的红、绿和蓝色分量的百分比数量。

1 OpenGL中光的类型(1)环境光。

环境光并不来自任何特定的方向。

它来自某个光源,但光线却是在房间或场景中四处反射,没有方向性可言。

由环境光所照射的物体在所有方向上的所有表面都是均匀照亮的。

(2)散射光。

散射光来自于一个特定的方向,但它均匀地在一个表面反射开来。

虽然光是均匀反射的,但受到光线直接指向的物体表面还是比其它从某个角度受到光线掠过的表面更亮一些。

(3)镜面光。

镜面光也是有方向的,但它的反射角度很锐利,是沿一个特定的方向。

高强度镜面光趋向于在它所照射的表面上形成一个亮点。

(4)发射光。

带有发射光的物体看起来就好像自身会发光,只不过这样的光不会对场景中的其它物体产生影响。

在OpenGL 中,发射光增加了物体的亮度,但是任何光源都不会影响发射光。

2 OpenGL中添加光照的步骤在OpenGL中添加光照需要遵循以下步骤:①为每个物体的每个顶点计算法向量,法线确定了物体相对于光源的指向;②创建、选择并定位所有的光源;③创建并选择一种光照模型;④为场景中的物体定义材质属性。

浅谈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.0。

实验OpenGL光照

实验OpenGL光照

实验7 OpenGL光照一、实验目的了解掌握OpenGL程序的光照与材质,能正确使用光源与材质函数设置所需的绘制效果。

二、实验内容(1)下载并运行Nate Robin教学程序包中的lightmaterial 程序,试验不同的光照与材质系数;(2)运行示范代码1,了解光照与材质函数使用。

三、实验原理为在场景中增加光照,需要执行以下步骤:(1)设置一个或多个光源,设定它的有关属性;(2)选择一种光照模型;(3)设置物体的材料属性。

具体见教材第8章8.6节用OpenGL生成真实感图形的相关内容。

四、实验代码#include<GL/glut.h>#include<stdlib.h>static int year =0,day=0;void init(void){GLfloat mat_specular[]={1.0,1.0,1.0,1.0};GLfloat mat_shininess[]={50.0};GLfloat light_position[]={1.0,1.0,1.0,0.0};GLfloat white_light[]={1.0,1.0,1.0,1.0};GLfloat Light_Model_Ambient[]={0.2,0.2,0.2,1.0};glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_SMOOTH);//glMaterialfv(材质指定,单值材质参数,具体指针);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//镜面反射光的反射系数glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);//镜面反射指数//glLightfv(光源,属性名,属性值);glLightfv(GL_LIGHT0, GL_POSITION, light_position); //光源位置glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); //漫放射光分量强度glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); //折射光强度glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Light_Model_Ambient);//光源2 GL_LIGHT1GLfloat mat_specular1[]={1.0,1.0,1.0,1.0};GLfloat mat_shininess1[]={50.0};GLfloat light_position1[]={0.0,0.0,0.0,0.0};GLfloat red_light[]={1.0,0.0,0.0,1.0};GLfloat Light_Model_Ambient1[]={0.2,0.2,0.2,1.0};glLightfv(GL_LIGHT1, GL_POSITION, light_position1); //光源位置glLightfv(GL_LIGHT1, GL_DIFFUSE, red_light); //漫放射光分量强度glLightfv(GL_LIGHT1, GL_SPECULAR, red_light); //折射光强度glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Light_Model_Ambient1);//开启灯光glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glEnable(GL_DEPTH_TEST);}void display(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();// 定义太阳的材质并绘制太阳{GLfloat sun_mat_ambient[] = {1.0f, 0.0f, 0.0f, 1.0f}; //定义材质的环境光颜色,偏红色GLfloat sun_mat_diffuse[] = {0.5f, 0.5f, 0.0f, 1.0f}; //定义材质的漫反射光颜色,偏红色GLfloat sun_mat_specular[] = {1.0f,0.0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,红色GLfloat sun_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0GLfloat sun_mat_shininess = 32.0f;glMaterialfv(GL_FRONT,GL_AMBIENT,sun_mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,sun_mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,sun_mat_specular);glMaterialfv(GL_FRONT,GL_EMISSION,sun_mat_emission);glMaterialf (GL_FRONT,GL_SHININESS,sun_mat_shininess);glutSolidSphere(0.5,40,16);//太阳glRotatef((GLfloat) year,0.0,1.0,0.0);}glPushMatrix();{GLfloat earth_mat_ambient[] = {0.0f, 0.0f, 1.0f, 1.0f}; //定义材质的环境光颜色,偏蓝色GLfloat earth_mat_diffuse[] = {0.0f, 0.0f, 0.5f, 1.0f}; //定义材质的漫反射光颜色,偏蓝色GLfloat earth_mat_specular[] = {1.0f, 0.0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,红色GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0GLfloat earth_mat_shininess = 30.0f;glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);glTranslatef(0.8,0.0,0.0);glRotatef((GLfloat) day,0.0,1.0,0.5);//位置变化glutSolidSphere(0.2,20,8);//地球{GLfloat earth_mat_ambient[] = {0.0f, 1.0f, 0.0f, 1.0f}; //定义材质的环境光颜色,偏绿色GLfloat earth_mat_diffuse[] = {0.0f, 0.5f, 0.0f, 1.0f}; //定义材质的漫反射光颜色,偏绿色GLfloat earth_mat_specular[] = {1.0f, .0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,红色GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0GLfloat earth_mat_shininess = 30.0f;glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);glTranslatef(0.4,0.0,0.0);glRotatef((GLfloat) day,0.0,1.0,0.0);glutSolidSphere(0.1,20,8);//月亮}}glPopMatrix();glPopMatrix();glutSwapBuffers();glFlush();}void reshape(int w,int h){glViewport(0,0,(GLsizei) w,(GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h){glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-10.0, 10.0);}else{glOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0 ,10.0);}glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);}void keyboard(unsigned char key, int x,int y){switch (key){case 'd':day=(day+10)%360;glutPostRedisplay();break;case 'D':day=(day-10)%360;glutPostRedisplay();break;case 'y':year=(year + 5)%360;glutPostRedisplay();break;case 'Y':year=(year-5)%360;glutPostRedisplay();break;case 27:exit(0);break;default:break;}}int main(int argc,char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;}五、实验结果以下是实验结果截图:六、实验分析实验中,两个主要函数,glMaterialfv(材质指定,单值材质参数,具体指针),设置图形材质,glLightfv(光源,属性名,属性值),用来设置光源。

OpenGL光照

OpenGL光照

简单光照模型
当光照射到一个物体表面上时,会出现三种情 形。
– 首先,光可以通过物体表面向空间反射,产生反射光。 – 其次,对于透明体,光可以穿透该物体并从另一端射
出,产生透射光。 – 最后,部分光将被物体表面吸收而转换成热。
在上述三部分光中,仅仅是透射光和反射光能够进入人 眼产生视觉效果。简单光照模型只考虑被照明物体表 面的反射光影响,假定物体表面光滑不透明且由理想 材料构成,环境假设为由白光照明。
glEnable(GL_LIGHTING);
若使光照无效,则调用gDisable(GL_LIGHTING)可 关闭当前光照。然后,必须使所定义的每个光源有效, 例中只用了一个光源,即:
glEnable(GL_LIGHT0);
其它光源类似,只是光源号不同而已。
• 材质颜色
材质
OpenGL中,材质的定义与光源的定义很相似,是通 过定义材料对红、绿、蓝三色光的反射率来近似定义材 料的颜色。象光源一样,材料颜色也分成环境、漫反射 和镜面反射成分,它们决定了材料对环境光、漫反射光 和镜面反射光的反射程度。
在进行光照计算时,材料对环境光的反射率与每个进 入光源的环境光结合,对漫反射光的反射率与每个进入 光源的漫反射光结合,对镜面光的反射率与每个进入光 源的镜面反射光结合。
对环境光与漫反射光的反射程度决定了材料的颜色, 并且它们很相似。对镜面反射光的反射率通常是白色或 灰色(即对镜面反射光中红、绿、蓝的反射率相同)。 镜面反射高光最亮的地方将变成具有光源镜面光强度的 颜色。例如一个光亮的红色塑料球,球的大部分表现为 红色,光亮的高光将是白色的。
OpenGL光组成
• 漫射光来自一个方向,它垂直于物体时比倾斜时 更明亮。一旦它照射到物体上,则在各个方向上 均匀地发散出去。于是,无论视点在哪里它都一 样亮。来自特定位置和特定方向的任何光,都可 能有散射成分。

opengl基础6

opengl基础6
将纹理模式映射到物体模型表面,模拟物体表面 细节和光照,称为纹理映射(Texture Mapping) 纹理空间
纹理一般定义在单位正方形域0s1,0t1上,称为纹理
空间
t
1
0
0
1
s
1.1 纹理映射
纹理模式
纹理函数 定义在纹理空间中的函数。例如: b [ s 8 ] [ t 8 ]为 奇 数 g (s, t) a [ s 8 ] [ t 8 ]为 偶 数
第七章
纹理映射
Introduction of Computer Graphics
前 言
上讲内容
简单光照模型
光源 环境光 漫反射 镜面反射 光强衰减 颜色 透明度 阴影
前 言
上讲内容
面的明暗处理
平面明暗处理 Gouraud明暗处理 Phong明暗处理 光线跟踪算法 辐射度光照模型 BRDF光照模型
s 2u / ,
Y X
将投影像素区映射到纹理空间
对每个投影像素区所覆盖的纹理图案中的
光强值取平均,得到像素的光强度
1.2 环境映射
Environment Mapping,将空间光照模型作为纹理映射到物体 表面 首先定义一个描述单个或一组物体周围环境的光强度数组 (即环境纹理,包括光源强度、天空和其他背景物体),将 环境纹理映射到一个封闭环境中表面; 然后根据观察方向将环境空间表面的环境纹理映射至物体表 面,实现全局镜面反射和漫反射效果; 环境映射的封闭空间可以是球体,更经常使用立方体或圆柱 体形状的封闭空间。
纹理空间: (s,t) 数组坐标
-1 MTMT
对象空间: (u,v) 表面参数

OpenGL中的光照

OpenGL中的光照

计算机图形学课程报告光照学生:蒋志强学号:S062311老师:代术成目录目录 (1)计算机图形学及OPENGL简介 (2)光照简介 (3)光照中的光源 (4)光照中的材质 (5)光照中的纹理 (9)三维太阳系模拟程序(SOLAR SYSTEM)介绍 (11)SOLAR SYSTEM详细说明 (12)参考资料 (22)计算机图形学及OpenGL简介计算机图形学是计算机科学的重要组成部分,在模拟仿真、虚拟现实、飞行员驾驶员训练、医疗、教学、演示等各个方面都得到了广泛得应用。

其中最火热的应用是在3D游戏方面,并极大的推动了相关计算机硬件的高速发展。

我第一次接触3D游戏是在小学6年纪的时候,当时玩的就是每个游戏爱好者都如雷贯耳的DOOM。

从那个时候开始,由于游戏商业利润的吸引,相应的计算机硬件的发展速度惊人的迅速,竞争的激烈也可以用残酷来形容。

以至于3D加速卡曾经的业界老大3dfx都走了被nvida兼并的一天。

DOS版本下的DOOM正是因为硬件的飞速发展才为计算机图形学在各个领域的广泛应用铺平了道路,让相应的API软件开发包有了在现实舞台上一展身手的机会。

微软的3D API开发包从最早MS-DOS下的DirectX 1.0到如今Vista的.NET平台下的DirectX 10,OpenGL在工业界的事实上的标准的确立,移动平台上的JA V A 3D 的发展,这些3D开发API的发展为3D开发程序员提供了强大的工具。

在这些3D API中,OpenGL有着特殊的地位,在工业上被广泛的使用,是事实上的工业标准。

OpenGL是一个到图形应将爱你的软件接口(API),包括250个函数,程序员使用它们来创建和控制3D交互程序。

OpenGL是一个独立于硬件的高效接口,可在很多硬件平台上实现,在UNIX、Linux、Mactosh上都可以使用OpenGL开发。

当然在PC上也提供相应的支持,在PC游戏史上上有着划时代意义的电子游戏QUAKE的3D图像在底层就是使用的OpenGL。

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--光照

从生理学的角度上讲,眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达了眼睛。

人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏。

因此对于人类而言,光线很大程度上表现了物体的立体感。

请看图1,图中绘制了两个大小相同的白色球体。

其中右边的一个是没有使用任何光照效果的,它看起来就像是一个二维的圆盘,没有立体的感觉。

左边的一个是使用了简单的光照效果的,我们通过光照的层次,很容易的认为它是一个三维的物体。

图1OpenGL对于光照效果提供了直接的支持,只需要调用某些函数,便可以实现简单的光照效果。

但是在这之前,我们有必要了解一些基础知识。

一、建立光照模型在现实生活中,某些物体本身就会发光,例如太阳、电灯等,而其它物体虽然不会发光,但可以反射来自其它物体的光。

这些光通过各种方式传播,最后进入我们的眼睛——于是一幅画面就在我们的眼中形成了。

就目前的计算机而言,要准确模拟各种光线的传播,这是无法做到的事情。

比如一个四面都是粗糙墙壁的房间,一盏电灯所发出的光线在很短的时间内就会经过非常多次的反射,最终几乎布满了房间的每一个角落,这一过程即使使用目前运算速度最快的计算机,也无法精确模拟。

不过,我们并不需要精确的模拟各种光线,只需要找到一种近似的计算方式,使它的最终结果让我们的眼睛认为它是真实的,这就可以了。

OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。

光源就是光的来源,可以是前面所说的太阳或者电灯等。

材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL中没有考虑光的折射),材质特点就决定了物体反射光线的特点。

光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。

在物理学中,光线如果射入理想的光滑平面,则反射后的光线是很规则的(这样的反射称为镜面反射)。

OpenGL中的颜色光照和材质

OpenGL中的颜色光照和材质

(2)GL_SHININESS属性。



GL_LIGHT_MODEL_COLOR_CONTROL表示颜色计算方式。如果设置为 GL_SINGLE_COLOR,表示按通常顺序操作,先计算光照,再计算纹理。 如果设置为GL_SEPARATE_SPECULAR_COLOR,表示将 GL_SPECULAR属性分离出来,先ቤተ መጻሕፍቲ ባይዱ算光照的其它部分,待纹理操作完成 后再计算GL_SPECULAR。后者通常可以使画面效果更为逼真.
步骤3:启动光源
函数: glEnable


使用glEnable函数可以开启这些光源。 如:glEnable(GL_LIGHT0);可以开启第0号光源。 使用glDisable函数则可以关闭光源。 注意:一些OpenGL实现可能支持更多数量的 光源,但总的来说,开启过多的光源将会导致 程序运行速度的严重下降,
(1)GL_AMBIENT、GL_DIFFUSE、 GL_SPECULAR属性。


这三个属性与光源的三个对应属性类似,每一属性都由四个值组成。 GL_AMBIENT表示各种光线照射到该材质上,经过很多次反射后最 终遗留在环境中的光线强度(颜色)。 GL_DIFFUSE表示光线照射到该材质上,经过漫反射后形成的光线 强度(颜色)。 GL_SPECULAR表示光线照射到该材质上,经过镜面反射后形成的 光线强度(颜色)。通常,GL_AMBIENT和GL_DIFFUSE都取相同 的值,可以达到比较真实的效果。 使用GL_AMBIENT_AND_DIFFUSE可以同时设置GL_AMBIENT和 GL_DIFFUSE属性。
GL_LIGHT0进行设置,第二个参数表示要设置的是漫反射光成分,第三个参 数则是一个数组(表示光照属性值)

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.加载立方体模型的顶点数据。

光线跟踪 辐射度法 OpenGL中的光照

光线跟踪 辐射度法 OpenGL中的光照

全局光照2.5 光线跟踪算法2.5 光线跟踪算法2.5.1 基本光线跟踪算法zT1 R122.5.1 基本光线跟踪算法2.5.1 基本光线跟踪算法2.5.1 基本光线跟踪算法2.5.2 快速光线跟踪算法2.5.2 快速光线跟踪算法2.5.2 快速光线跟踪算法2.5.2 快速光线跟踪算法P in P out2.6 辐射度光照模型dYX2.6 辐射度光照模型2.6 辐射度光照模型d2.6 辐射度光照模型2.6 辐射度光照模型2.6 辐射度光照模型2.6 辐射度光照模型中的光照3.1 OpenGL中的光照设置设置光照模型属性3.2 定义法矢量3.2 定义法矢量P 2 P 3u 2*p3, double *n )12N u un[0]=a[1]*b[2]-a[2]*b[1]; n[1]=a[2]*b[0]-a[0]*b[2];3.3 创建光源3.3 创建光源3.3 创建光源3.3 创建光源3.3 创建光源3.3 创建光源3.3 创建光源3.3 创建光源3.3 创建光源GL_SPOT_CUTOFF3.4设置光照模型属性3.4设置光照模型属性3.4设置光照模型属性3.4设置光照模型属性3.5定义物体表面材质属性3.5定义物体表面材质属性3.5定义物体表面材质属性3.5定义物体表面材质属性3.5定义物体表面材质属性void init(void)glMaterialfv(GL_FRONT,GL_SHININESS,mat_shiness);glShadeModel(GL_SMOOTH); /*绘制茶壶*/void myReshape(GLsizei w,GLsizei h)。

opengl光源光照使用范例

opengl光源光照使用范例

OpenGL光源光照使用范例1. 光照模型环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失.全局环境光——每个光源都能对场景提供环境光。

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

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

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

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

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

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

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

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

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

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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6.6.1、光照模型 ◇ 介绍例程:ep_7_1_光照球
6.6.1、光照模型 ◇ OpenGL光组成 在OpenGL简单光照模型中的几种光分为:辐射光 (Emitted Light)、环境光(Ambient Light)、漫 射光(Diffuse Light)、镜面光(Specular Light)。 辐射光是最简单的一种光,它直接从物体发出并 且不受任何光源影响。 环境光是由光源发出经环境多次散射而无法确定 其方向的光,即似乎来自所有方向。一般说来,房间 里的环境光成分要多些,户外的相反要少得多,因为 大部分光按相同方向照射,而且在户外很少有其他物 体反射的光。当环境光照到曲面上时,它在各个方向 上均等地发散(类似于无影灯光)。
光学反射模型
通常物体表面的反射光可以认为包含三个分量:对环境光的 反射、对特定光源的漫反射和镜面反射。
(a) 漫反射
(b) 理想镜面反射
(c) 一般光滑表面的镜面反射
(d) 理想镜面反射方向 与视线方向的夹角
图6-6 光学反射模型
环境光的反射: 环境光(ambient light)来自周围环境(如墙面)散射的光,在 空间近似均匀分布,入射至物体表面后向空间各个方向均匀 反射出去。物体对环境光的反射分量表示: 其中Ia是入射的环境光亮度,Ka是环境光漫反射系数,它与物 体表面性质有关。如果简单光照模型中仅考虑环境光的反射分 量,则物体表面的亮度是一个恒定值,没有明暗的自然过渡。 散射(diffuse reflection): 散射分量表示特定光源在物体表面的反射光中那些向空间 各个方向均匀反射出去的光。兰伯特(Lambert)余弦定律指出: 当点光源照射到一个散射体时,其表面反射光亮度和光源入射 角(入射光线和表面法矢量的夹角)的余弦成正比,即 I K d I l cos( ) 0 0 Kd 1
5.2 OpenGL中的光照
OpenGL提供的函数可以方便地实现隐藏面消除、光照计 算、纹理映射。
OpenGL中隐藏面的消除采用的是Z缓冲器算法。
glEnable(GL_DEPTH_TEST )和glDisable(GL_DEPTH_TEST )
打开和禁止深度测试。 OpenGL进行光照计算时采用的是简单光照模型,只考虑 光源直接照射下物体表面的反射,不考虑光在物体间的反射 和光的透射。 glEnable(GL_LIGHTING)和glDisable(GL_LIGHTING) 打开和禁止光照计算。
Phong 光照模型
考虑环境光、散射和镜面反射,则物体表面的反射光亮度 为: n
I K a I a K d I l cos( ) K s I l cos ( )
实际上光的亮度与传播距离的平方成反比,Il为光源处的 光亮度,光线抵达物体表面以及从物体表面反射进入观察者 眼睛的过程中存在衰减的问题。漫反射分量和镜面反射分量 应该乘以一个衰减因子,以取得远的物体看起来暗些的效果。 当场景的投影变换采用透视投影时,Warnock提出线性衰减因 子1/d,而Rommey提出衰减因子1/dp可以取得比较真实的效果。 此时Phong光照模型可以进一步描述为: Il I Ka Ia p K d cos( ) K s cos n ( ) d K 其中d是物体上当前考察点到视点的距离,K是一个任意的常 量, 0 p 2 。
ra 1 g Ka a dp K ba
rl m j ( K d cos j K s cos n j ) gl j j 1 bl j
建立简单光照模型后,就可以用于消隐算法中计算像素所对 应的物体上可见点的亮度。
Gouraud明暗处理(插值颜色)
由于每个像素点都需要法向量插值和光照计算,Phong明暗处理计算 量较大,一种简化的处理方法是先利用光照模型计算出多边形顶点处亮 度,然后对亮度进行双线性插值,直接获得像素的颜色,如图6-8,P1、 P2、P3是多边形顶点,其亮度已经计算出。A点的亮度可以由P1、P2点的 亮度线性插值计算出,B点的亮度可以由P1、P3点的亮度线性插值计算出, 于是P点的亮度可以由A、B点的亮度线性插值计算出。 Phong明暗处理计算量远大于Gouraud明暗处理,但效果好。
6.6.1、光照模型
6.6.1、光照模型 ◇创建光源举例 (1)指定光源的位置:
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position);
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 }; (2)指定环境光颜色、散射光、镜面反射光


计算物体上可见点光亮度时通常是将光亮度转换成为光栅图形 显示器采用的RGB三基色,这时计算需要在三个基色上分别进 行。如果存在多个光源,则将效果线性相加。此时光照模型可 以描述为 :
I Ka Ia
m
Il j
dp K j 1
( K d cos j K s cos n j )
Phong明暗处理(插值法矢)
如图6-8,P1、P2、P3是多边形顶点,其法 矢量视为共该点的所有多边形法矢量的平 均值。由P1、P2的法矢量可以线性插值计 算出A点的法矢量,由P1、P3的法矢量可 以线性插值计算出B点的法矢量,于是P 点的法矢量可以由A、B点处的法矢量线 性插值计算出,计算出P的法矢量后应用 简单光照模型可以计算出P点的光亮度。 图6-8 对P点进行双线性插值
6.6.1、光照模型 ◇ OpenGL光组成 漫射光来自一个方向,它垂直于物体时比倾 斜时更明亮。一旦它照射到物体上,则在各个方向上 均匀地发散出去。于是,无论视点在哪里它都一样亮。 来自特定位置和特定方向的任何光,都可能有散射成 分。 镜面光来自特定方向并沿另一方向反射出去,一 个平行激光束在高质量的镜面上产生100%的镜面反射。 光亮的金属和塑料具有很高非反射成分,而象粉笔和 地毯等几乎没有反射成分。
6.6.1、光照模型 ◇创建光源(Light Source) 光源有许多特性,如颜色、位置、方向等。选择 不同的特性值,则对应的光源作用在物体上的效果也 不一样,这在以后的章节中会逐步介绍的。下面详细 讲述定义光源特性的函数glLight*(): void glLight{if}[v](GLenum light , GLenum pname, TYPE param) 创建具有某种特性的光源。其中第一个参数light 指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、 GL_LIGHT7。第二个参数pname指定光源特性,这个参 数的辅助信息见表10-1所示。最后一个参数设置相应 的光源特性值。
5.1 光照技术
单纯判别物体表面的可见性,远远不能反映物体表面的真实感。
物体表面所呈现的颜色是由表面向视 线方向辐射进入人眼中光决定的。建 立数学模型模拟物体表面的光照明物 理现象,按照数学模型计算物体表面 向视线方向辐射进入人眼中的光亮度, 即可获得像素所对应的物体上的可见 点的颜色,这样绘制出来的图形具有 图6-5 (a) 经过光照计算的球 较强的真实感,如图6-5(a)。这些数 (b) 不经过光照计算的球 学模型就称为明暗效应模型或者光照 明模型。 当光照射到物体表面时,光可能被吸收、反射和透射,被物体吸收的部分 转化为热,只有反射、透射的光能够进入人眼产生视觉效果,它们决定了 物体所呈现的颜色。如果物体是不透明的,则透射光不存在,物体的颜色 仅由反射光决定。这种情形正是简单光照模型需要考虑的,简单光照模型 只考察光源直接照射下物体表面的反射情况。
2
I Ka I a
0 Ka 1
其中Il是来自点光源的入射光亮度。Kd是漫反射系数,与物体表 面性质有关。 是入射光线和表面法矢量的夹角(如果 >90?)。
兰伯特反射光照模型
只考虑对环境光的反射分量和对特定光源的散射分量,则物 体表面的反射光亮度为 : 0 Ka Kd 1 I Ka I a Kd Il cos( ) 0 2 适用于粗糙、无光泽的物体,如粉笔、黑板。对于擦亮的金属、 光滑的塑料等光亮物体需要计算镜面反射。 镜面反射(specular reflection): 表示特定光源在物体表面的反射光中那些遵循反射定律的 光。对于纯镜面,反射光和入射光对称地分布在表面法向的两 侧。对于一般光滑表面,表面可理解为由许多朝向不同的微小 平面构成,入射光经许多微小平面反射后形成的反射光不再是 单向的,而是分布于理想镜面反射方向的周围。通常采用余弦 函数的幂次来模拟一般光滑表面的镜面反射光的空间分布。 n I K s I l cos ( ) 0 2 Il是入射光亮度。Ks是物体表面镜面反射系数,为理想镜面反 射方向与视线方向的夹角,n为镜面反射光的会聚指数。
明暗处理
光照计算时需要用到多边形上点的法矢量,如果多边形 上点的法矢量总是取多边形的面法矢,则由于不同平面片之 间法矢量不连续,最终绘制出来的图像看起来呈多面体状。
图6-7(a) 多边形表示的物体
(b) Gouraud明暗处理
解决方法:首先多边形的顶点法矢量不再简单的取为其所在多 边形的面法矢,而是取为共该顶点的所有多边形的面法矢的平 均值;其次多边形内部点的法矢量也不再简单地取为多边形的 面法矢,而是利用多边形顶点的法矢量通过双线性插值计算出。
glLightfv(GL_LIGHT0, GL_AMBIENT , light_ambient ); glLightfv(GL_LIGHT0, GL_DIFFUSE , light_diffuse ); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
相关文档
最新文档