三维图形的光照、贴图及阴影处理(OpenGL)

合集下载

利用3DMAX进行光照与阴影设置

 利用3DMAX进行光照与阴影设置

利用3DMAX进行光照与阴影设置在3DMAX中,光照与阴影设置对于提升场景的真实感和逼真度至关重要。

通过合理的光照设置,可以有效地模拟现实世界中的光照效果,使得模型在渲染过程中产生逼真的阴影效果。

本文将介绍如何在3DMAX中进行光照与阴影设置,以及一些实用的技巧和注意事项。

一、环境光设置在3DMAX中,环境光是指由场景中各种光源共同产生的背景光照。

环境光可以通过调整光源的颜色、亮度和方向来模拟不同光照条件下的环境光效果。

要设置环境光,可以按照以下步骤进行操作:1. 在视图中选择菜单栏中的“渲染”->“环境光”选项,打开环境光设置面板。

2. 在面板中可以调整环境光的颜色、强度等参数。

通过调整颜色和亮度,可以模拟不同光照条件下的环境光效果。

3. 确定设置后,点击“确定”按钮应用环境光设置。

二、定向光设置定向光是指模拟太阳光等具有方向性的光源。

定向光可以模拟出自然光照下的明暗效果和长短阴影。

要设置定向光,可以按照以下步骤进行操作:1. 在视图中选择菜单栏中的“创建”->“光源”->“光源”选项,创建一个定向光源。

2. 调整定向光源的位置和方向。

通过调整光源的位置和方向,可以控制光源投射的光线的方向和角度。

3. 调整光源的颜色和强度。

通过调整光源的颜色和强度,可以模拟不同光照条件下的阳光效果。

4. 确定设置后,点击“确定”按钮应用定向光设置。

三、点光源设置点光源是指从一个点发出的光源,可以模拟灯泡等点状光源的效果。

点光源可以用于照明和聚焦某个特定的区域。

要设置点光源,可以按照以下步骤进行操作:1. 在视图中选择菜单栏中的“创建”->“光源”->“光源”选项,创建一个点光源。

2. 调整点光源的位置。

通过调整光源的位置,可以控制光源的照射范围和方向。

3. 调整光源的颜色和强度。

通过调整光源的颜色和强度,可以模拟不同光照条件下的灯光效果。

4. 确定设置后,点击“确定”按钮应用点光源设置。

利用OpenGL进行CAD三维图形消隐处理

利用OpenGL进行CAD三维图形消隐处理

利用OpenGL进行CAD三维图形消隐处理利用OpenGL进行CAD三维图形消隐处理三维图形消隐算法已比较成熟,但要普通编程人员对复杂三维图形进行消隐编程,却不是容易的事。

OpenGL图形库中提供了消隐处理函数,但消隐却不知因何原因而质量不高,如消隐时直线断断续续。

为此笔者进行了一定改进和精细消隐处理,下面介绍两种办法。

一、一般消隐这种方法为首先设置消隐使能,初始化深度缓存,设置消隐比较,直接进行绘图即可。

但此种结果是直线断断续续,时有时无,效果差。

改进只需将直线线宽加粗,若需多边形边框一同绘出,则要GL_LINES方式将边框线段重绘。

具体方法如下:glEnable(GL_DEPTH_TEST);//设置消隐使能glClearDepth(1.0);//设置初始化深度缓存值glClear(GL_DEPTH_BUFFER_BIT);//深度缓存消除gldephFunc(GL_LEQUAL);//设置消隐比较glLineWidth(2.0);//直线线宽应比多连形线宽多一倍下述设置后,即可开始绘图。

消隐能正常显示,只是直线线宽均比多边形宽一倍,图形变得粗糙,效果不十理想。

二、精细消隐处理精细消隐设计分三步:1、首先在消隐方式下对所有多边形面进行绘图,其目的是在深度缓存中写入消隐后的多边形面的Z值,并比较后再写入深度缓存,即大大简化了多边形面的Z缓存计算。

2、将直线及多边形边框直线由目标坐标转换成窗口坐标下的值,并将线段离散化为窗口坐标下的象素点,再比较象素点的窗口坐标下Z值与深度缓存值,从而将隐藏直线段消除,记录显示线段,并窗口坐标由三维换为二维。

3、消除显示缓存,重新显示二维窗口坐标下的可视线段。

这样处理,一方面极大地简化了Z缓存计算,使普通编程人员能胜任高级三维CAD软件设计,消隐显示质量高;另一方面获得的可视线段,便于纯Windows图形打印,大大地增强了OpenGL图形打印能力;此处还可便于三维图形标注。

OpenGL光照

OpenGL光照

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

实验七 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不考虑折射)特性;材质反映的是光照射到物体上后物体表现出来的对光的吸收、漫反射、反射等性能;光照环境反应环境中所有光源发出的光经过⽆数次反射、漫反射之后整体环境所表现出来的光照效果。

指定合适的光照环境参数可以使得最后形成的画⾯更接近于真实场景。

⼀、光源光照模型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的光照模型在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光照模型实现课程设计一、课程目标知识目标: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)。

3Dmax中的室内场景灯光与阴影设置

3Dmax中的室内场景灯光与阴影设置

3Dmax中的室内场景灯光与阴影设置3Dmax是一款广泛应用于室内场景设计的三维建模软件,其中灯光与阴影的设置是非常重要的环节。

本文将详细介绍在3Dmax中如何设置室内场景的灯光与阴影。

一、灯光设置1. 灯光类型选择:在3Dmax中,常用的灯光类型包括标准灯光、自然灯光和光源灯光。

根据场景的需要,选择适合的灯光类型。

2. 灯光位置设置:确定好灯光的位置,可以通过3Dmax视窗中的引导线设置灯光的位置,或者使用3Dmax的坐标轴工具精确定位。

3. 灯光参数调整:根据场景需求,调整灯光的亮度、颜色、投影模式等参数。

可以通过3Dmax的属性和光效管理器来调整灯光的属性。

二、阴影设置1. 阴影类型选择:在3Dmax中,常用的阴影类型包括射线追踪阴影、深度图阴影和影像图阴影。

根据场景的需要,选择适合的阴影类型。

2. 阴影参数调整:根据场景需求,调整阴影的亮度、颜色、模糊度等参数。

可以通过3Dmax的属性和渲染设置来调整阴影的属性。

3. 阴影投射与接收设置:根据物体之间的关系,设置物体是否投射阴影和接收阴影。

可以通过3Dmax的属性和阴影设置来进行调整。

4. 阴影质量设置:根据对阴影质量的要求,调整阴影的采样率和阴影精度。

可以通过3Dmax的属性和渲染设置来进行调整。

三、灯光与阴影实践技巧1. 利用灯光组合:在室内场景设计中,可以使用多个灯光的组合来实现更好的光照效果。

比如采用主光源、辅助灯光和背景灯光的组合,使整个场景更加真实。

2. 制造自然光效果:为了营造室内自然光的效果,可以使用3Dmax中的自然灯光设置。

例如,通过调整太阳光的角度和强度,可以模拟不同时间的自然光照明效果。

3. 调整材质属性:在灯光与阴影设置的同时,还要注意材质属性的调整。

合理的材质设置能够更好地反射、吸收、折射光线,进一步增强场景的真实感和逼真度。

4. 视角选择:在进行灯光与阴影设置时,要从不同视角观察效果。

通过改变视角,可以更好地把握光线的走向和阴影的分布情况,从而进行调整和优化。

使用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光照绘制

OPENGL光照绘制

计算机图形学
福建师范大学
增加镜面光
• 在SetupRC()中添加如下代码 • 定义直射光线 GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 指定光线强度 • 定义反射系数 GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f }; • 设置镜面光 glLightfv(GL_LIGHT0,GL_SPECULAR, specular); • 设置材料的反射属性 glMaterialfv(GL_FRONT, GL_SPECULAR, specref); glMateriali(GL_FRONT, GL_SHININESS, 128);
OPENGL光照模型绘制 光照模型绘制
计算机图形学
福建师范大学
在使用光照之前
• Jet.cpp • 程序功能: (1)用几个三角形组成简单的飞机模型 (2)对这些三角形设置不同的颜色 • 注意键盘的操作 (1)在main之前定义函数void SpecialKeys(int key, int x, int y) 1 main void (2)在main中glutSpecialFunc(SpecialKeys); (3)定义全局变量 static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f; (4)在SpecialKeys函数中根据键盘的方向键修改xRot和yRot的值, 并最后调用glutPostRedisplay();来通知操作系统重绘显示窗口 (5)在绘制时,使用xRot和yRot来控制三维物体的转向
计算机图形学
福建师范大学
(3)在void RenderScene(void)中添加如下 代码: ambientLight[0]=strength*1.0f; ambientLight[1]=strength*1.0f; ambientLight[2]=strength*1.0f; glLightModelfv(GL_LIGHT_MODEL_AMBIE NT,ambientLight);

第13讲 OpenGL 光照

第13讲 OpenGL 光照

glLightfv(GL_LIGHT0,GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT0,GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT0,GL_SPECULAR, LightSpecular);
光源的属性
位置
glLightf举例
GLfloat LightSpotExponent = 10.0f; GLfloat LightSpotCutoff = 20.0f; //聚光指数 //聚光角度
glLightf( GL_LIGHT1,GL_SPOT_EXPONENT, LightSpotExponent ); glLightf( GL_LIGHT1, GL_SPOT_CUTOFF, LightSpotCutoff );
选择光照模型
void glLightModeli(GLenum pname, GLint param); 功能:
选择光照模型
参数:
pname: 光照模型的类型 param: 该类型的值
返回值:无 备注:
pname可以取值为:
GL_LIGHT_MODEL_LOCAL_VIEWER //观察点是否无穷远(GL_FALSE) GL_LIGHT_MODEL_TWO_SIDE //单面还是双面光照(GL_FALSE )
kc+kld+kqd2
kc = GL_CONSTANT_ATTENUATION kl = GL_LINEAR_ATTENUATION kq = GL_QUADRATIC_ATTENUATION d为光源位置与顶点之间的距离
例:
glLightf(GL_LIGHT5, GL_CONSTANT_ATTENUATION, 2.0); glLightf(GL_LIGHT5, GL_LINEAR_ATTENUATION, 1.0); glLightf(GL_LIGHT5, GL_QUADRATIC_ATTENUATION, 0.5);

利用OpenGL进行CAD三维图形消隐处理

利用OpenGL进行CAD三维图形消隐处理

利用OpenGL进行CAD三维图形消隐处理
李义连
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】1998(000)011
【摘要】本文详细介绍了是用OpenGL的功能进行粗略消隐和精细消隐处理与计算,并给出了详细计算步骤及例程,有助于CAD设计与输出。

【总页数】2页(P54-55)
【作者】李义连
【作者单位】中国地质大学(武汉)环境科学与工程学院
【正文语种】中文
【中图分类】TP391.41
【相关文献】
1.利用OpenGL实三维有限元网格图的消隐显示 [J], 徐全生;冯艳君
2.利用树结构进行图形消隐处理 [J], 冯英进;张晓帆
3.基于OpenGL 三维非均匀FDTD 网格图形的消隐处理 [J], 周国祥;王春艳
4.利用OpenGL三维图形库进行三维实体造型 [J], 郭燕利;胡建军
5.巧用ATUOCAD命令对二维平面图形进行消隐 [J], 赵建军
因版权原因,仅展示原文概要,查看原文内容请购买。

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三维图形编程基础
2009年3月又公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新。 OpenGL 3.1将此前引入的OpenGL着色语言“GLSL”从1.30版升级到了1.40版,通过改进程序增强 了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管 理等等。
rgba模式颜色索引模式colorindexrgba模式为每个像素点指定颜色可提供丰富多彩的色彩效果其中a是混合因子用于各种特效处理对于显示能力不足的硬件可采用颜色索引模式系统提供一个颜色表通常有256或4096种颜色各像素点通过索引颜色表项得到颜色值opengl基本功能711光照和材质在现实生活中物体因为受光照射和自身对各种频率光波的吸收与反射能力的不同而呈现各自不同的颜色opengl的实现假设光仅仅由三原色rgb组成物体对三原色分别有不同的反射率即材质利用物理光学模型计算物体实际的颜色opengl基本功能811纹理映射texturemapping由于物体采用图元primitive表示点线多边形绘制时有效渲染的地方也仅仅是这些点线多边形其它位置的颜色值则通过插值实现这就造成了物体绘制的不真实纹理映射通过贴图的方式为物体表面贴上真实的色彩花纹这些被指定贴上的图片就称作纹理textureopengl提供了完善的纹理映射机制opengl基本功能911反走样antialiasing线段在计算机中是通过一系列的像素来近似逼近的而这些像素实际上是一个个的小正方形因此线段常常呈锯齿状这被称为走样aliasingopengl通过计算线段对各个像素的不同覆盖率来实现反走样antialiasingopengl基本功能1011图像特效融合blending为了使三维图形更加具有真实感经常需要处理半透明或透明的物体图像这就需要用到融合技雾fog正如自然界中存在烟雾一样opengl提供了fog的基本操作来达到对场景进行雾化的效果opengl基本功能1111双缓存doublebuffering动画出色的动画效果是opengl的一大特色opengl通过双缓存实现动画前台缓存显示当前帧后台缓存同时进行后续帧的场景计算生成画面opengl语法特点15所有opengl函数都使用gl作为前缀如glclearcolor所有opengl常量都使用gl开头并且所有字母都大写如glfalseopengl语法特点25opengl函数后缀说明后缀中的阿拉伯数字一般表示参数的数目如glvertex2i13表示该函数有两个参数阿拉伯数字后的小写字符一个或多个表示参数类型如glvertex2i13表示该函数的两个参数都为32位整数integer表示参数类型的后缀定义见下表opengl语法特点35opengl函数后缀说明opengl语法特点45opengl函数后缀说明有

三维图形的光照、贴图及阴影处理(OpenGL)

三维图形的光照、贴图及阴影处理(OpenGL)

三维图形的光照、贴图及阴影处理(OpenGL)实验过程:一、在VS6.0中建立新工程。

1、新建一个Win32 Application的工程。

2、向工程项目添加C++源文件。

3、将OpenGL框架复制到文件中。

4、设置OpenGL窗口标题。

二、场景设置。

1、视线处于一具有地板及前、左、右三面墙壁的空间中。

2、空间顶部中央有一光源。

3、空间中央有一地球仪,不断旋转。

三、建立视口结构及视点属性。

1、在坐标系上建立视图结构。

如图。

2、参数设置。

窗口大小:800*600。

视口大小:800*600。

透视深度:0.1~100。

透视角:60°。

视点位置:(0.0, 2.0, 15.0)。

视线方向:z轴负方向。

视点上方向:y轴正方向。

3、调用函数glViewport()、gluPerspective()和gluLookAt()实现。

四、绘制三维图形。

1、开启深度测试模式。

为防止图形重叠时出现层次混乱,必须对绘制图形进行消隐处理。

直接调用函数glEnable(GL_DEPTH_TEST)开启深度测试。

2、绘制地面与墙壁。

调用OpenGL基本几何元素绘制过程glBegin(GL_QUADS)、glBegin(GL_QUAD_STRIP)绘制四个平面,坐标范围为:x: -10~10, y: -2~20, z: -10~10。

坐标系结构如图。

3、绘制地球仪。

设计函数void DrawEarth()实现地球仪的绘制,分别调用OpenGL球面绘制函数gluSphere()绘制地球形状、柱面绘制函数gluCylinder()绘制地轴两头形状。

(1)参数设置。

球面半径:2。

球面细度:水平100,垂直100。

柱面半径:0.05。

柱面高度:1。

柱面细度:水平50,垂直1。

(2)结构如图。

4、绘制模拟光源。

(1)绘制“灯罩”。

调用glBegin(GL_TRIANGLE_STRIP)绘制4个三角形,构成棱椎形灯罩的4个侧面。

(2)绘制“灯泡”。

利用OpenGL实现三维绘图

利用OpenGL实现三维绘图

利用OpenGL实现三维绘图前言:在三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。

其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。

它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、 IBM、 DEC、 Sun、 HP等大公司的认同。

因此,OpenGL 已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具。

一.初始化OpenGL绘图环境1.定义颜色格式和缓冲模式OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式。

在RGBA模式下所有颜色的定义用RGB三个值来表示,有时也加上Alpha值(表示透明度)。

RGB三个分量值的范围都在0和1 之间,它们在最终颜色中所占的比例与它们的值成正比。

如:(1,1,0)表示黄色,(0,0,1)表示蓝色。

颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。

由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中RGBA 的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。

OpenGL提供了双缓存来绘制图像。

即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。

当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。

设置窗口显示模式函数:voidauxInitDisplayMode(AUX_DOUBLE//双缓存方式|AUX_RGBA);//RGBA颜色模式2.设置光源OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。

漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各个方向上均匀发散。

镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。

关于三维效果和阴影效果

关于三维效果和阴影效果

关于三维效果和阴影通过应用三维效果和阴影效果,能够为线条、自选图形和任意多边形添加深度。

通过使用三维效果,还能够更改图形对象的深度、颜色、角度、照明方向和表面效果。

通过使用阴影,能够添加图形对象的深度、调节阴影的位置并更改阴影的颜色。

还能够对图片应用局部阴影效果,但是必须将“嵌入型”环绕方式更改为其他环绕方式。

能够单独添加阴影或三维效果,但不能同时添加两者。

例如,假如在有阴影的图形对象上应用三维效果,阴影将会消失。

一、添加阴影①选择要添加阴影的一个或多个图形对象。

②单击“绘图”工具栏上的“阴影”按钮。

③在弹出的“阴影”列表中,单击一种你所需要的阴影效果。

提示:某些图形对象(如线条、剪贴画等)只能使用某几种阴影。

④对于添加了阴影效果的图形,能够单击“阴影设置”,用“阴影设置”工具栏修改其表现效果。

也能够使用它取消阴影(另一种取消阴影的方法为:在“阴影”列表中,单击“无阴影”)。

提示:单击一次微移阴影按钮,可将阴影移动一个像素点,而按住Shift键单击,每次可将其移动六个像素距离。

二、设置三维效果①选择要添加三维效果的一个或多个图形对象。

②单击“绘图”工具栏上的“三维效果”按钮。

③在弹出的“三维效果”列表中,单击一种你所需要选用的效果样式。

提示:为图形设置了三维效果后,其线条格式将被取消。

④对于设置了三维效果的图形,能够单击“三维设置”,用“三维设置”工具栏修改其表现效果。

也能够使用它取消三维效果(另一种取消三维效果的方法为:在“三维效果”列表中,单击“无三维效果”)。

注意:①一个图形对象只能设置一种效果,假如对添加了阴影的对象再实行三维效果的设置,将取消其阴影效果,同样的,假如对象添加了三维效果设置,对象再实行阴影的设置,将取消其三维效果。

②对于剪贴画,能够为其整体添加阴影,无法添加三维效果(但拆分后能够为其各组成局部添加三维效果);对于其他格式的图片,阴影和三维效果都无法添加。

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

三维图形的光照、贴图及阴影处理(OpenGL)实验过程:一、在VS6.0中建立新工程。

1、新建一个Win32 Application的工程。

2、向工程项目添加C++源文件。

3、将OpenGL框架复制到文件中。

4、设置OpenGL窗口标题。

二、场景设置。

1、视线处于一具有地板及前、左、右三面墙壁的空间中。

2、空间顶部中央有一光源。

3、空间中央有一地球仪,不断旋转。

三、建立视口结构及视点属性。

1、在坐标系上建立视图结构。

如图。

2、参数设置。

窗口大小:800*600。

视口大小:800*600。

透视深度:0.1~100。

透视角:60°。

视点位置:(0.0, 2.0, 15.0)。

视线方向:z轴负方向。

视点上方向:y轴正方向。

3、调用函数glViewport()、gluPerspective()和gluLookAt()实现。

四、绘制三维图形。

1、开启深度测试模式。

为防止图形重叠时出现层次混乱,必须对绘制图形进行消隐处理。

直接调用函数glEnable(GL_DEPTH_TEST)开启深度测试。

2、绘制地面与墙壁。

调用OpenGL基本几何元素绘制过程glBegin(GL_QUADS)、glBegin(GL_QUAD_STRIP)绘制四个平面,坐标范围为:x: -10~10, y: -2~20, z: -10~10。

坐标系结构如图。

3、绘制地球仪。

设计函数void DrawEarth()实现地球仪的绘制,分别调用OpenGL球面绘制函数gluSphere()绘制地球形状、柱面绘制函数gluCylinder()绘制地轴两头形状。

(1)参数设置。

球面半径:2。

球面细度:水平100,垂直100。

柱面半径:0.05。

柱面高度:1。

柱面细度:水平50,垂直1。

(2)结构如图。

4、绘制模拟光源。

(1)绘制“灯罩”。

调用glBegin(GL_TRIANGLE_STRIP)绘制4个三角形,构成棱椎形灯罩的4个侧面。

(2)绘制“灯泡”。

调用gluSphere()绘制球形灯泡。

(3)参数设置。

灯罩底面:四个底面顶点距底面中心距离为1。

灯罩高度:1。

灯罩颜色:顶点为(0.8, 0, 0),底面顶点为(0.8, 0.8, 0),绘制时颜色自然过渡。

灯泡半径:0.4。

灯泡颜色:(1, 1, 0.8)。

(4)整体结构如图。

五、光照效果。

1、设置全局环境光。

调用函数glLightModelfv()调节全局泛射光强度为(1, 1, 1, 1)。

2、设置光源0。

调用函数glLightfv()调节光源泛射光强度为(1, 1, 1, 1),漫反射光强度为(2, 2, 2, 1),光源位置为(0, 10, 0, 1),最后一个参数指定光照类型为非平行光。

3、光照效果开启与关闭。

光照效果仅作用于地面、墙壁、地球及地轴,模拟光源不使用光照效果。

调用函数glEnable(GL_LIGHTING)和glDisable(GL_LIGHTING)实现光照模式的开启和关闭。

六、设置地球仪和模拟光源的自转。

调用函数glRotatef()实现旋转,转轴与地轴同一直线,设置变量earth_rotate 为旋转角度,每帧更新递增4°,则绘图时自动旋转。

七、纹理贴图。

1、载入贴图。

(1)设计函数BOOL LoadTexture()实现贴图载入,对应的贴图引用ID保存在数组texture[NTEX]中。

(2)在初始化函数Initialize()中调用LoadTexture()载入贴图。

2、绘制贴图。

(1)调用函数glBindTexture()为下面绘制的图形绑定贴图。

(2)调用函数glTexCoord2f()建立二维图形与贴图的坐标映射。

(3)调用函数gluQuadricTexture()建立球面与贴图的坐标映射。

3、贴图模式的开启与关闭。

贴图只应用于地面、墙壁和地球面,地轴和模拟光源不使用贴图。

调用函数glEnable(GL_TEXTURE_2D)和glDisable(GL_TEXTURE_2D)实现贴图模式的开启和关闭。

4、带光照效果和纹理贴图的图形绘制。

八、阴影效果。

1、平面阴影投射矩阵的推导。

设投射平面α的方程为Ax + By + Cz + D=0,光源位置为L(Lx, Ly, Lz),空间某点P(Px, Py, Pz)在平面α上的投影坐标为S(Sx', Sy', Sz'),则有L,P,S共线,且ASx' + BSy' + CSz' + D = 0。

如图。

令向量L = (Lx, Ly, Lz, 0),P = (Px, Py, Pz, 1),S = (Sx', Sy', Sz', 1),N = (A, B, C, D),则有ASx' + BSy' + CSz' + D = S · N = [k'(P –L) + L] · N= [k'P + (1 –k')L] · N = 0,令k = (k' – 1) / k'得(P + kL) · N=0,解得k = –(P · N) / (L · N) = – (APx + BPy + CPz + D) / (ALx + BLy + CLz)。

将上式代入S = P + kL可得Sx' = Px + kLx= Px – Lx(APx + BPy + CPz + D)/(ALx + BLy + CLz)= [Px · (BLy + CLz) –Py · BLx –Pz · CLx –1 · DLx]/(ALx + BLy + CLz)= P · (BLy + CLz,– BLx, –CLx, – DLx )/(ALx + BLy + CLz),Sy' = P · (– ALy, ALx + CLz, –CLy, – DLy )/(ALx + BLy + CLz),Sz' = P · (– ALz, – BLz, ALx + BLy, – DLz )/(ALx + BLy + CLz),1 =P · (0, 0, 0, ALx + BLy + CLz )/(ALx + BLy + CLz)。

在OpenGL中,四维坐标有以下转换关系:(x, y, z, k) = (kx, ky, kz, 1)。

由此,得到S的四维向量坐标S = HP,其中P为空间某点P的向量坐标,H即为平面阴影投射矩阵。

在OpenGL中,有一个4×4的空间-平面坐标变换矩阵R,将三维坐标映射为屏幕实际显示出来的二维图形。

故有S0 = RS = RHP = R'P,其中R' = RH。

从而在R'的变换下,图形将被“压扁”地绘制到阴影投射平面上。

2、阴影投射矩阵的生成算法。

设计函数void GenerateShadow()计算阴影投射矩阵,记录在二维数组shadow[4][4]中。

3、绘制阴影。

(1)关闭光照和纹理贴图,设置阴影颜色。

(2)为防止阴影与投射平面重合导致绘图层次混乱,将阴影绘制平面上移一个小单位。

(3)对于四个阴影投射平面,分别计算阴影投射矩阵,并与当前模型视图矩阵相乘。

(4)由于当前模型视图矩阵被修改,要恢复之前的状态必须将运算前的矩阵压入矩阵栈,阴影绘制结束后弹出。

(5)调用地球仪绘制函数DrawEarth()即可完成阴影绘制。

九、键盘控制。

1、设置变量posX、posY、posZ、rotH、rotV,分别控制地球仪坐标和水平、垂直旋转角度。

2、在地球仪绘制函数void DrawEarth()中添加坐标变换函数。

3、在框架函数void Update()中添加键盘按键响应及边缘控制。

十、文字说明。

1、制作文字贴图。

2、绘制文字贴图平面。

绑定贴图,建立坐标映射,绘制平面。

平面位置在视口空间的前部,即总在地球仪位置前方。

3、设置透明效果。

设置混合类型,开启透明模式,关闭深度测试,设置阴影颜色及其透明度。

绘制结束后关闭透明模式,重新开启深度测试。

实验结果:一、图形绘制效果。

1、整体效果较为理想。

2、消隐效果良好。

如不开启深度测试,则会出现以下现象。

二、透视效果。

1、窗口结构和整体透视效果与计算预期结果一致。

2、地球仪移动到窗口边缘时会出现明显变形,如图所示。

三、光照效果。

1、仅地球仪和墙壁、地面受中心光源0光照,其他只受全局环境泛射光影响,与预期结果相同。

2、地球仪受光明显,出现光照面与阴暗面,且方向正确。

3、关闭贴图可以看到良好的整体光照效果。

四、贴图效果。

1、平面、球面贴图均得到较好效果。

图略。

2、颜色深度设置为16位色,如果图片格式不正确,会出现贴图错误。

五、阴影效果。

1、在透明模式下,地球阴影与地轴阴影相叠加,阴影明显失真。

2、阴影在多个面的交汇处得到十分准确的效果。

六、动画效果。

1、实现了地球仪和模拟光源的自转,转速适中。

2、使用10个键盘按键实现地球仪的平移和旋转控制。

3、在接近墙壁、地面和视点处设置坐标控制,限制了球面的平移范围。

但因地轴位置不确定,无法实现范围控制,即有可能穿透边缘。

七、文字说明及其透明效果。

1、位于所有图形之前,窗口右上角边缘附近。

2、透明效果良好。

实验讨论:一、关于OpenGL框架。

1、老师给的框架无法直接实现键盘控制功能,所以选用了《计算机图形学实验教程(OpenGL版)》中的简单框架。

2、在OpenGL框架下,只需要增加一些全局变量,修改少数几个函数的内容即可实现绘图及控制功能。

如在Initialize()函数中初始化窗口环境,在DrawSceneGL()中绘制图形和其他效果,在Update()中设置键盘实时控制。

3、但是在这个VC环境的框架下,每个函数分别实现了不同的功能,不可混用。

Initialize()只在创建窗口时调用一次,DrawSceneGL()在整个程序运行过程中被反复调用,而Update()则在有键盘动作时响应。

刚开始时将LoadTexture()函数放在DrawSceneGL()中调用,结果程序运行是反复载入纹理贴图,最终导致内存溢出,程序崩溃。

4、在OpenGL中,图形是根据DrawSceneGL()被连续绘制的,因此动画控制无需用循环实现,只需设置改变量即可。

二、OpenGL是一个状态机。

1、OpenGL的整个绘制过程时刻贯穿着“状态机”的思想,强调的是“当前状态”。

即在每一个图形的绘制之前必须先设置好各种绘制状态,如视图属性、光照效果、贴图功能、透明模式等等,图形的绘制都是根据当前的绘制状态进行绘制的。

相关文档
最新文档