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编程技术-光照

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

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中还可以设置聚光灯效果,这里我们就不讨论了。
光照处理
我们先看一下两个效果图,左边是没有光照的,右边是有光照的(不要认为有光照就亮,没有光照就黑哦,判别的依据应该是右图中出新了阴影,因此立体感也更强,如果觉得这个效果不好,可以自行调整个参数的)。
下面我们讨论具体的实现过程,同时阐述各个语句的作用:
1、添加几个全局变量:
下面这些变量用于控制光照开关的,我们通过按键L来控制光照开关。
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 设置漫反射分量
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // 设置光源位置
Hale Waihona Puke glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Light_Model_Ambient);
此时的效果就正常了。
设置反射光:和环境光,漫反射光设置的方法类似,我们首先增加全局变量,它们分别表示光源的反射光分量和材质的反射光分量,它们共同决定了最终的颜色,现在我们将它设置成白色,可以起到反射很强的效果,你可以自己修改参数:
GLfloat LightSpecular[]= { 1.0f, 1.0f, 1.0f, 1.0f };
glMaterialfv(GL_FRONT,GL_SPECULAR,MaterialSpecular);//材质的反射分量
glMaterialf(GL_FRONT,GL_SHININESS,128);//后面的值越大,光线越集中
GL_SHININESS设置的值越大(最大也就128),光线越集中,但事实上我们并没有看到聚焦的效果,这是因为我们的图形分得不够细,我们如果改用一只轮胎(这个是glaux.h中提供的),就可以看清这个值的作用了。光照作用到整个场景中,以后随着场景的复杂度增加,光照的效果会更好。只要用这个代码代替绘制三棱锥和立方体代码就行了:

实验七 OpenGL光照效果

实验七 OpenGL光照效果

1.实验七OpenGL光照效果(选做)1.实验七:OpenGL光照效果。

2.实验目的:通过上机编程,熟悉并掌握OpenGL中光照效果的制造方法。

3.实验要求:(1)先做实验项目:实验六“OpenGL组合图形”。

(2)每人一组,独立完成。

(3)利用OpenGL提供的颜色、光源、材质设置,对实验六“OpenGL组合图形”中自己设计的物体设置绘制颜色和材质参数,并在场景中添加光源,形成一定的光照明暗效果。

4.实验原理及内容:在现实世界中,光线和物体的材质共同决定了物体在人眼中的效果。

OpenGL 中则涉及到绘制颜色、物体的材质参数、场景中的光源颜色和位置,以此达到一定的真实感光照效果。

(1)颜色:OpenGL通过指定红、绿、蓝(RGB)三个成分的各自亮度来确定颜色,有时还有第四个成分alpha:glColor*(red, green, blue[, alpha]);glColor()函数设置当前的绘图颜色,red、green和blue分别为红、绿、蓝的亮度,alpha为透明度,取值均为0.0~1.0。

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

(2)光线: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. 实践案例:结合实际项目,运用光照模型为三维场景添加光照效果,培养学生的实际操作能力。

实验7 OpenGL光照

实验7 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_Ambient 1);//开启灯光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/(G Lfloat)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光照模型的着色器实现

探究OpenGL 光照模型的着色器实现探究OpenGL 光照模型的着色器实现OpenGL 的着色器是新一代显卡提供给开发者一个小程序,为的是让开发者对光照、坐标转换以及像素进行一些个性化的处理。

OpenGL 的着色器有一种专门的语言:GLSL ,现在的GLSL 应该全面转向Shader Model5 ,像我这样的初学者还需要花费更长的时间来学习才能基本了解OpenGL 的着色器方面的知识。

下面两图展示了OpenGL 从固定渲染管线到可编程渲染管线的变化从图中我们可以很容易地看出,OpenGL 的顶点着色器取代了固定渲染管线的转换、光照、纹理坐标生成和转换;片断着色器取代了纹理、颜色求和和雾的操作。

在OpenGL3.2 版本中加入了几何着色器( GeometryShader )这个概念,在OpenGL4.0 中又添加了分格化控制( Tessellation Control ) 和分格化评估( Tessellation Evaluation )着色器,最新的OpenGL 版本4.3 则添加了计算着色器 ( Compute Shader )。

看来OpenGL 的着色器真是越来越复杂,越来越重要了。

下面介绍一下光照模型在顶点着色器的实现,所有的内容都可以在《OpenGL 超级宝典 (第四版)》中找到。

漫反射光照是一种简单的光照模型,它只考虑漫反射。

它的公式是:N 是顶点的单位法线,L 是表示从顶点到光源的单位向量方向。

C mat 是表面材料的颜色,C li 是光线的颜色,C diff 是最终的散射颜色。

注意,N 和L 在传入之前一定要单位化。

如果用顶点着色器来实现的话,则是:uniform vec3 lightPos[1];void main( void ){// 法线的MVP 变换gl_Position = gl_ModelViewProjectionMatrix *gl_Vertex;vec3 N = normalize( gl_NormalMatrix * gl_Normal );vec4 V = gl_ModelViewMatrix * gl_Vertex;vec3 L = normalize( lightPos[0] - V.xyz ); // 输出散射颜色float NdotL = dot( N, L ); gl_FrontColor = gl_Color* vec4( max( 0.0, NdotL ) );} 注意,这里lightPos 是一个标记为uniform 的变量,这意味着可以在运行期传入的一个值到lightPos 中来改变着色器的行为。

OpenGL---------光照的基本知识

OpenGL---------光照的基本知识

OpenGL---------光照的基本知识从⽣理学的⾓度上讲,眼睛之所以看见各种物体,是因为光线直接或间接的从它们那⾥到达了眼睛。

⼈类对于光线强弱的变化的反应,⽐对于颜⾊变化的反应来得灵敏。

因此对于⼈类⽽⾔,光线很⼤程度上表现了物体的⽴体感。

请看图1,图中绘制了两个⼤⼩相同的⽩⾊球体。

其中右边的⼀个是没有使⽤任何光照效果的,它看起来就像是⼀个⼆维的圆盘,没有⽴体的感觉。

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

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

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

⼀、建⽴光照模型在现实⽣活中,某些物体本⾝就会发光,例如太阳、电灯等,⽽其它物体虽然不会发光,但可以反射来⾃其它物体的光。

这些光通过各种⽅式传播,最后进⼊我们的眼睛——于是⼀幅画⾯就在我们的眼中形成了。

就⽬前的计算机⽽⾔,要准确模拟各种光线的传播,这是⽆法做到的事情。

⽐如⼀个四⾯都是粗糙墙壁的房间,⼀盏电灯所发出的光线在很短的时间内就会经过⾮常多次的反射,最终⼏乎布满了房间的每⼀个⾓落,这⼀过程即使使⽤⽬前运算速度最快的计算机,也⽆法精确模拟。

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

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

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

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

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

第13讲 OpenGL 光照

第13讲 OpenGL 光照

选择光照模型
全局环境光
即使没有其他光源,也可以看到场景中的物体
例:设置全局环境光颜色
GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 }; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
选择光照模型
OpenGL光照模型包括4项内容
全局环境光强度 观察点靠近场景还是位于无穷远处 单面光照或双面光照 镜面反射颜色是否独立于环境颜色、散射颜色(OpenGL 1.4)
选择光照模型的函数
glLightModelfv(…); glLightModeli(…);
选择光照模型
void glLightModeli(GLenum pname, GLint param); 功能:
选择光照模型
参数:
pname: 光照模型的类型 param: 该类型的值
返回值:无 备注:
pname可以取值为:
GL_LIGHT_MODEL_LOCAL_VIEWER //观察点是否无穷远(GL_FALSE) GL_LIGHT_MODEL_TWO_SIDE //单面还是双面光照(GL_FALSE )
GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_POSITION GL_SPOT_DIRECTION //环境光的颜色(默认黑色) //散射光的颜色(默认白色或黑色) //镜面反射光(默认白色或黑色) //光源的位置(默认(0,0,1)) //聚光灯的方向(默认(0,0,-1))
kc+kld+kqd2
kc = GL_CONSTANT_ATTENUATION kl = GL_LINEAR_ATTENUATION kq = GL_QUADRATIC_ATTENUATION d为光源位置与顶点之间的距离

光线跟踪 辐射度法 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-第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)。

简单光照模型
当光照射到一个物体表面上时,会出现三种情 形。
– 首先,光可以通过物体表面向空间反射,产生反射光。 – 其次,对于透明体,光可以穿透该物体并从另一端射
出,产生透射光。 – 最后,部分光将被物体表面吸收而转换成热。
在上述三部分光中,仅仅是透射光和反射光能够进入人 眼产生视觉效果。简单光照模型只考虑被照明物体表 面的反射光影响,假定物体表面光滑不透明且由理想 材料构成,环境假设为由白光照明。
glEnable(GL_LIGHTING);
若使光照无效,则调用gDisable(GL_LIGHTING)可 关闭当前光照。然后,必须使所定义的每个光源有效, 例中只用了一个光源,即:
glEnable(GL_LIGHT0);
其它光源类似,只是光源号不同而已。
• 材质颜色
材质
OpenGL中,材质的定义与光源的定义很相似,是通 过定义材料对红、绿、蓝三色光的反射率来近似定义材 料的颜色。象光源一样,材料颜色也分成环境、漫反射 和镜面反射成分,它们决定了材料对环境光、漫反射光 和镜面反射光的反射程度。
在进行光照计算时,材料对环境光的反射率与每个进 入光源的环境光结合,对漫反射光的反射率与每个进入 光源的漫反射光结合,对镜面光的反射率与每个进入光 源的镜面反射光结合。
对环境光与漫反射光的反射程度决定了材料的颜色, 并且它们很相似。对镜面反射光的反射率通常是白色或 灰色(即对镜面反射光中红、绿、蓝的反射率相同)。 镜面反射高光最亮的地方将变成具有光源镜面光强度的 颜色。例如一个光亮的红色塑料球,球的大部分表现为 红色,光亮的高光将是白色的。
OpenGL光组成
• 漫射光来自一个方向,它垂直于物体时比倾斜时 更明亮。一旦它照射到物体上,则在各个方向上 均匀地发散出去。于是,无论视点在哪里它都一 样亮。来自特定位置和特定方向的任何光,都可 能有散射成分。
• 镜面光来自特定方向并沿另一方向反射出去,一 个平行激光束在高质量的镜面上产生100%的镜面 反射。光亮的金属和塑料具有很高非反射成分, 而象粉笔和地毯等几乎没有反射成分。因此,从 某种意义上讲,物体的反射程度等同于其上的光 强(或光亮度)。
光强度衰减
• 辐射光线从一点光源出发在空间中传播时, 通常可按以下因子进行衰减 f(d)=1/(a0+a1d+a2d2) d为光线经过的路径长度
• 考虑衰减,则物体表面某点处光强度为 I=Idiff+Ispec=kaIa+f(d)(kdIlcos θ +ksIlcosnsφ)
OpenGL
在OpenGL简单光照模型中的几种光分为: 辐射光(Emitted Light)、环境光(Ambient Light)、漫射光(Diffuse Light)、镜面光 (Specular Light)。
OpenGL光照
生成真实感图形基本步骤
一:建模,即用一定的数学方法建立所需三维场景 的几何描述,场景的几何描述直接影响图形的复 杂性和图形绘制的计算耗费;
二:将三维几何模型经过一定变换转为二维平面透 视投影图;
三:确定场景中所有可见面,运用隐藏面消隐算法 将视域外或被遮挡住的不可见面消去;
四:计算场景中可见面的颜色,即根据基于光学物 理的光照模型计算可见面投射到观察者眼中的光 亮度大小和颜色分量,并将它转换成适合图形设 备的颜色值,从而确定投影画面上每一象素的颜 色,最终生成图形。
Light Source

• 光源有许多特性,如颜色、位置、方向等。选择 不同的特性值,则对应的光源作用在物体上的效

果也不一样。


void glLight{if}[v](GLenum light , GLenum pname, TYPE param)

创建具有某种特性的光源。其中第一个参数
light指定所创建的光源号,如GL_LIGHT0、
对于材质,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)。
光 • 辐射光是最简单的一种光,它直接从物体发出并 且不受任何光源影响。
组 • 环境光是由光源发出经环境多次散射而无法确定 其方向的光,即似乎来自所有方向。一般说来,

房间里的环境光成分要多些,户外的相反要少得
多,因为大部分光按相同方向照射,而且在户外
很少有其他物体反射的光。当环境光照到曲面上
时,它在各个方向上均等地发散(类似于无影灯 光)。即没有空间和方向上的特征。
GL_LIGHT1、...、GL_LIGHT7。第二个参数
pname指定光源特性,这个参数的辅助信息见下
表。最后一个参数设置相应的光源特性值。
• 光源位置可以是无限远,称为方向光源,可以认 为是平行的,另一种是点光源,也称为位置光源,
当定义时w为0时,即为方向光源

光源特性
启动光照
• 在OpenGL中,必须明确指出光照是否有效或无效。如 果光照无效,则只是简单地将当前颜色映射到当前顶点 上去,不进行法向、光源、材质等复杂计算,那么显示 的图形就没有真实感,如前几章例程运行结果显示。要 使光照有效,首先得启动光照,即:
材质定义
• 材质的定义与光源的定义类似。其函数为:
void glMaterial{if}[v](GLenum face,GLenum pname,TYPE param);
定义光照计算中用到的当前材质。face可以是 GL_FRONT、GL_BACK、GL_FRONT_AND_BACK, 它表明当前材质应该应用到物体的哪一个面上;pname 说明一个特定的材质;param是材质的具体数值,若函数 为向量形式,则param是一组值的指针,反之为参数值本 身。非向量形式仅用于设置GL_SHINESS。pname参数 值具体内容见表。另外,参数 GL_AMBIENT_AND_DIFFUSE表示可以用相同的RGB 值设置环境光颜色和漫反射光颜色。
材质定义
材质
RGB 值和 光源
RGB 值的 关系
材质的颜色与光源的颜色有些不同。对于源, R、G、B值等于R、G、B对其最大强度的百分比。 若光源颜色的R、G、B值都是1.0,则是最强的白光; 若值变为0.5,颜色仍为白色,但强度为原来的一半, 于是表现为灰色;若R=G=1.0,B=0.0,则光源 为黄色。
相关文档
最新文档