OpenGL中的光照技术研究

合集下载

图形学光照实验报告

图形学光照实验报告
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
}
for(i=-y;i<=y;i++)
{
for(int i=-x;i<=x;i++)
{
mColor=Phong(x0,y0,r,i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
deltax += 2;
deltay += 4;
x++;
y--;
}
CirclePt( x0, y0, x, y, mColor);
}
}
//根据中点圆算法填充圆域
void FlatCircle(int x0, int y0, int r, Color mColor)
{
int x,y,deltax,deltay,d;
x = 0;
y = r;
deltax = 3;
deltay = 5-r-r;
d = 1-r;
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);

浅谈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的像素光照计算技术
于顶点 的光照计算 要精确 得多 。不过 , 由于 图中没有 加入衰
减 因子 , 所以它 比基于顶点 的光照计算 的效果要亮一些。
13 两种光照计 算的比较 . 通过 以上 比较可 以看 出, 于顶点 的光照计 算方法 优点 基
在于减少 了光照计算 的次 数 , 进而可 以提高绘制 的速度 。不 足之处在于绘制 的效果 不够精细。即使使用 了纹理贴 图 , 但 由于一个面上 只有各个顶 点的光照效果是精 确计算 的,如果
3 D应用程序的真实感提供 了更多 的途径 , 其中最为重要 的一 项技术就是基于像素 的光照计算技术 。由于基 于像 素的光照
J H H 熊H溅 H I
图2 基于像素的光照计算流程
同样 , 我们也是使用 6个三 角面 , 通过 O eG pn L演 示其光 照 的效果 , 与使用 6个三角面的基于顶点 的光 照相 比 , 比基 要
2 1 基 于像素 的光照计 算技术的硬件平 台 .
通过 O e G pn L中提供 的光照 功 能, 一个 点 光源 打在 三 将
Hale Waihona Puke 个互相垂直 的平面上 , 可看 到使用 6个 三角面 的基于顶点 的
光照计算得到的显示效果很差 , 本看 不出有光照的效果 , 根 这 是因为顶点的数 目太 少。通过增加 顶点 的数 目, 如将 每个 平
为 了实现基 于像 素的光照计算 , 需要一块 G Fre eoc 更 3或
高级的可编程 图形显示卡 。在 G F re 列显卡 中加入 了寄 e oc 系
存 器组合器和顶点级 编程器 , 寄存 器 组合器 主要 负责在像 素 级上的操作 ,提供 了像素 级上 的加 法 、 法 等运 算 ,更重 要 乘 的是提供 了点积运算 功能 , 正是这 些新 功能 使得基于像 素的

OpenGL光照

OpenGL光照

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

第六讲_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光照模型的着色器实现

探究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中的光照模型一、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增加而衰减,但点光源和聚光灯会发生衰减。

使用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。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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中的光照技术研究
摘 要 : 照 处理 是 增 强 图 形 真 实感 的 重要 组 成 部 分 , 要 研 究 了如 何 在 场 景 中添 加 Op n 光 主 eGL光 照 , 绍 了添 加 光 照 介
的基 本 步骤 以 及 实现 方 法 , 对 如 何 设 置物 体 的 材 质 属 性 作 了 简要 介 绍 。 并
红 、 和 蓝 色 分 量 来 计 算 光 和 光 照 。也 就 是 说 , 个 光 的 绿 ~ 颜 色 由 此 光 中 的红 、 和蓝 色 分 量 的 数 量 决 定 。 当光 照 射 绿 到一 个 表 面 时 , e GL根 据 其 表 面 的 材 质 来 确 定 此 表 面 Op n
3 O e G 光 照 的 使 用 pn L
2 Op n e GL 中添 加 光 照 的 步 以下 步骤 : 为 每 个 pn L ①
物 体 的每 个 顶 点 计 算 法 向量 , 线确 定 了 物 体 相 对 于 光 源 法
面 所 吸 收 , 些 光 子 则 被 表 面 所 反 射 。不 同 的 表 面 所 具 有 有 的属 性 不 同 。 物体 本 身 如 果 是 用 光 滑 的材 质 所 组 成 , 此 在 情 况 下 就会 反 射 更 多 的光 , 的 眼 睛 因 此 也 将 接 受 到 更 多 人 的光 子 。如果 物 体 是 由粗 糙 的材 质 所 组 成 , 多 的光 子 会 更 被 其 吸 收 或 者 被 反 射 出视 野 之外 , 此 眼 睛 就 不 会 接 受 到 因
0 引 言
当观 察 一 个 物 体 时 , 看 到 的颜 色 是 基 于光 子 的 分 布 所 而 形 成 的 , 是 这 些 光 子 刺 激 了人 眼 圆锥 细 胞 。这 些 光 子 正
可 能 来 自单 个 光 源 , 可 能 来 自多 个 光 源 。有 些 光 子 被 表 也

OpenGL渲染技术研究

OpenGL渲染技术研究

OpenGL渲染技术研究OpenGL是一种跨平台的API,常用于游戏开发、计算机图形学、科学可视化等领域。

它提供了丰富的功能,包括3D渲染、纹理映射、光照、阴影处理等。

在本文中,我们将探讨OpenGL在渲染方面的一些技术。

着色器着色器是OpenGL渲染的重要组成部分,它们可以在GPU上运行。

常用的着色器包括顶点着色器、片元着色器、几何着色器等。

其中,顶点着色器主要用于对顶点的位置、颜色、法线等进行变换和计算;片元着色器负责计算基于像素的颜色和光照计算;几何着色器可以根据输入的几何形状产生新的几何形状。

光照光照是OpenGL渲染中的重要问题之一。

在光照计算中,我们需要考虑光源、物体表面的材质、光线和观察者的位置等因素。

常用的光照模型包括漫反射、镜面反射、环境光反射等。

其中,漫反射表示物体表面对不同方向的光线的反射情况,它的强度随着光线和表面法向量的夹角增大而减小;镜面反射则表示表面对来自光源方向的光线的反射情况,它的强度随着反射角和观察角的差别增大而增加。

纹理映射纹理映射是OpenGL中常用的一种技术,它是将一个或多个图像映射到3D物体的表面上,以增加真实感和细节度。

纹理可以是2D或3D图像,它们可以包含颜色、法线贴图、高度贴图等信息。

在OpenGL中,我们可以使用纹理坐标来确定图像在3D空间中的位置。

纹理过滤和纹理重复是常用的纹理技术。

纹理过滤可以对纹理的放缩进行控制,如在远处的物体上使用更低分辨率的纹理;而纹理重复则可以控制纹理的重复次数,以达到更好的纹理附着效果。

顶点缓冲对象顶点缓冲对象(VBO)是OpenGL中对顶点数据进行高效渲染的一种技术。

使用VBO能够显著提高OpenGL程序的性能。

在OpenGL中,我们可以通过VBO将各个顶点的位置信息存储在缓存中,从而减少顶点渲染时的CPU和GPU交互次数。

此外,VBO还支持多种格式的数据访问方式,如顶点数组、索引数组等。

小结OpenGL是游戏开发和计算机图形学等领域中的重要技术之一。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(2)散射光。

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

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

(3)镜面光。

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

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

(4)发射光。

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

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

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

3 OpenGL光照的使用
3.1 创建光源
创建光源使用glLight *( )函数,该函数最常用的形式为:V oid glLightfv(GLenum light,GLenum pname,TYPE *param);
该函数有3个参数,包含所要为其指定属性的光、所要指定的属性和此属性的值。

参数light的值可以是GL_LIGHT0、GL_LIGHT1等,一直到GL_LIGHT7,其指定了将要对那个光源进行设置。

Pname参数的取值情况如表1所示。

3.2 光源的定位
光源的位置是以GL_POSITION参数和一个4值的矢量(x,y,z,w)来定义的。

如果w的值等于0.0,那么(x,y,z)的值就定义了一个矢量,其指定了光线照过来的方向。

这样的光源称为定向光源,其所有光线都是平行的,就好像其光源的位置在无穷远。

定向光的最普通的实例为太阳,太阳所发出的光到达地球时,其所有光线都几乎是彼此平行的。

当指定的w值非0时,所定义的就是一个定点光源,对于定点光源,(x,y,z)的值定义了此光源在物体齐次坐标系中的坐标位置。

3.3 光的衰减
衰减就是光随着距离光源的距离的增大其强度的减小。

对于定点光源,可以通过设置衰减因子达到这样的效果。

为一个定向光源设置衰减因子是没有意义的。

3.4 聚光灯的设置
当定点光源的辐射面从全方位减小到某一个特定方向时,就会得到一个聚光灯。

创建聚光灯,需要设定聚光灯的边界、聚光灯的方向和聚光灯的焦点。

在OpenGL中通过GL_SPOT_CUTOFF参数设定聚光灯光照圆锥面与其轴线之间的角度,GL_SPOT_CUTOFF的值的范围是从0°到90°。

利用参数GL_SPOT_DIRECTION指定聚光灯的方向;利用参数GL_SPOT_EXPONENT指定聚光灯的焦点,也就是聚光灯在其光柱中的聚光点。

从此点到光柱边界,光的强度随之衰减,直至在光柱的边界消失。

聚光指数越高,光源的聚光性能就越好。

3.5 选择光照模型
光照模型的概念主要包含4个部分:①全局环境光的强度;
②观察点的位置是局部与场景还是位于无限远处;③物体的正面和背面是否应该执行不同的光照计算;④镜面颜色是否应该从环境和散射颜色中分离出来,并在纹理操作之后再行应用。

用于指定光照模型的所有属性的函数是glLightModel+*( )。

glLightModel *( )具有两个参数,为光照模型属性以及这个属性需要设置的值。

V oid glLightModel{if}(GLenum pname,TYPE param);
V oid glLightModel{if}v(GLenum pname,TYPE +*
param);
用上述函数设置光照模型的属性。

被设置的光照模型的特征是由pname定义的,它指定了一个命名参数。

Param表示pname 属性被设置的值。

3.6 启用光照
在OpenGL中,需要显式地启用或者禁用光照。

启用光照方法如下:
glEnable(GL_LIGHTING);
禁用光照,可以用GL_LIGHTING为参数调用glDisable( )函数。

在指定了每个光源的参数之后,还需要显式的启用定义的每个光源,例如启用光源GL_LIGHT0:
glEnable(GL_LIGHT0);
4 定义材质
绝大多数材料属性类似于在创建光源时所使用的属性,所使用的函数如下所示:
V oid glMaterial{if}(GLenum face,GLenum pname,TYPE param);
V oid glMaterial{if}v(GLenum face,GLenum pname,TYPE +*param);
Face可以是GL_FRONT、GL_BACK或GL_FRONT_AND_BACK。

表示应用物体材料的那个面。

设置的特定材料属性由pname确定。

Param提供了具体的属性值,可以
是个指向一组值的指针,也可以是属性值本身。

调用glMaterial *( )函数之后,所绘制的所有多边形都会受到其设置的材质的影响,直到再次调用glMaterial+*( )函数。

设置物体材质属性的另外一种方法叫做颜色追踪,颜色追踪使得可以告诉OpenGL仅仅通过调用glColor来设置材料属性。

为启用颜色追踪的功能,需要以GL_COLOR_MATERIAL为参数调用glEnable:
glEnable(GL_COLOR_MATERIAL);
glColorMaterial函数遵循glColor所设置的值来指定材料参数。

假如为设置多边形正面的散射光属性以便追踪glColor所设置的颜色,可以进行以下调用:
glColorMaterial(GL_FRONT,GL_DIFFUSE);
5 结束语
在本文中对于OpenGL光照技术的相关细节进行了一定的研究和阐述,介绍了如何在场景中添加光照,以及物体材质属性的设置方法。

参考文献:
[1] RICHARD S,WRIGHT J R.BENJAMIN LIPCHAK.OpenGL 超级宝典(第三版)[M].北京:人民邮电出版社,2005.
[2] 唐荣锡,汪嘉业,彭群生,等.计算机图形学教程(修订版)[M].北京:科学出版社,2000.
[3] DA VE ASTLE,KEVIN HAWKINS.OpenGL游戏编程(第一版)[M].重庆:重庆大学出版社,2006.
[4] K.霍金D.阿斯特.OpenGL游戏程序设计[M].北京:科学出版社,2006.
[5] DA VE SHREINER.OpenGL编程指南[M].北京:机械工业出版社,2006.。

相关文档
最新文档