关于光线投射算法的OpenGL高效实现

合集下载

关于光线投射算法的OpenGL高效实现

关于光线投射算法的OpenGL高效实现

Ab t a t Th a e s i l y c si g ag r h t o v a t e2 i g D g . e u et -ie r sr c ep p r e man v r a t lo i m c n e D u a n t o h ma et 3 i o ma e W s il a r n i tr o a in ag r m ac lt e c l ra d o a i ft e s mp ig i r e p o e t e a c r c f3D nep l o lo i t h t t c lu a et o o n p ct o a l n o d r o i r v c u a y o o h y h n t m h
பைடு நூலகம்rc nt cin T e ag rh cc l e e ac rt poet e rgo f3 rg l aaf l bsd o e eo s ut . h loi m aua st cuae r c v e in o D eua d t i d ae n t r o t t h j i r e h
、 l No 4 , 37 o . J 12 0 u. 0 8
关于光线投射算法 fO eG 高效 实现 l pn L  ̄
解 梅 ,景孝 凯
成都 60 5 ) 1 0 4
( 电子科技 大 学 电子工程 学 院
【 摘要 】采用 光线投射算法对二维( ) 2 图片实现三维(D重建,用3 D 3) 线性插值 算法计 算每个采样点的颜 色 值和 不透 明 , 度 提高三维重建 图 像后 的精度 。 该算法实现主要借助于O eG  ̄ 库及其三 维观察矩阵 , pn L 以其精确计 算规 则三维数据场在观察 方向上 的二维投影 区域 ,减少了光 线投射算法 中 投射光线数量 。 根据 Poe hn光照模型为数据 场预先计算和保存 明暗表 , 并通过 优化常规现 实代码 , 效地提 高了光线投射体绘制算法 的效率 。该算 法既保证 了 有 精度 ,又提 高了显示的速度 。 关 键 词 三维重建; O eG : 光 线投射 算法; 变化矩阵: 3 pn L 线性插值; 可视 化; 体绘 制 中图分类号 T 3 1 P 9 文献标识码

基于OpenGL的光照处理技术及实现

基于OpenGL的光照处理技术及实现

基于OpenGL的光照处理技术及实现
李治国;郭立
【期刊名称】《计算机仿真》
【年(卷),期】2008(025)003
【摘要】光照处理是增强图形真实感最重要的组成部分,包括光照模型的选择和明暗处理.通过研究影响物体表面反射光的相关因素,提出了真实感图形绘制中如何进行模拟光照计算和明暗插值计算的问题.在分析和研究OpenGL图形库下实现光照效果的改善,并系统地阐述了利用OpenGL函数在VC++环境下实现光照图形的基本过程和方法.最后在计算机设备上实例绘制了不同光照处理方法下的对比图形,显示出了真实感光照的效果,同时具有一定的使用指导意义.
【总页数】3页(P221-223)
【作者】李治国;郭立
【作者单位】中国科学技术大学电子科学与技术系,安徽,合肥,230026;中国科学技术大学电子科学与技术系,安徽,合肥,230026
【正文语种】中文
【中图分类】TP317.4
【相关文献】
1.基于OpenGL的三维服装CAD中光照技术的实现 [J], 吴志明;王鹏
2.利用OpenGL实现RGBA模式下的光照处理 [J], 冯渊
3.基于OpenGL的光照模型及其MFC实现 [J], 金永斌;刘苏
4.基于OpenGL的像素光照计算技术 [J], 陈栗;陈福生
5.基于OpenGL的光照处理技术绘制真实感图形 [J], 王玉华;杨克俭;王玲
因版权原因,仅展示原文概要,查看原文内容请购买。

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

计算机图形学课程报告光照学生:蒋志强学号: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光照效果

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)设置。

使用 vtk体绘制中常用的光线投射算法

使用 vtk体绘制中常用的光线投射算法

使用 vtk体绘制中常用的光线投射算法使用vtk体绘制中常用的光线投射算法光线投射算法是计算机图形学中常用的算法之一,用于在三维空间中模拟光线的传播和交互。

在vtk(Visualization Toolkit)中,光线投射算法被广泛应用于体绘制(Volume Rendering)中。

本文将介绍vtk体绘制中常用的光线投射算法,并对其原理和应用进行详细说明。

一、光线投射算法概述光线投射算法是一种基于光线追踪的体绘制算法,通过模拟光线与物体之间的相互作用,实现对三维体数据进行可视化。

它基于光线与物体之间的交互,计算光线在物体内部的传播路径和颜色,从而生成逼真的体绘制效果。

在vtk中,光线投射算法主要包括两个步骤:光线传播和光线采样。

光线传播是指光线从视点出发,沿着视线方向向前传播,直到与物体相交或超出体数据范围为止。

光线采样是指在光线与物体相交的位置上进行采样,获取物体的颜色和透明度信息,并将其累积到最终的像素颜色中。

二、光线传播算法光线传播算法是光线投射算法的核心部分,它决定了光线的传播路径和采样点。

在vtk中,常用的光线传播算法有正向投影和反向投影两种方式。

1. 正向投影(Front-to-Back Compositing)正向投影是指光线从视点出发,沿着视线方向向前传播,直到与物体相交或超出体数据范围为止。

在传播过程中,每次都将光线经过的像素颜色叠加到最终的像素颜色中,从而得到物体的透明效果。

正向投影算法通常采用透明度混合的方式,根据物体的透明度信息对像素颜色进行加权叠加。

透明度越高的像素将对最终的像素颜色贡献越大,从而实现透明效果。

该算法适用于透明度变化较大的情况,但对于密度变化较大的物体可能会出现混合效果不佳的问题。

2. 反向投影(Back-to-Front Compositing)反向投影是指光线从视点出发,沿着视线方向向后传播,直到与物体相交或超出体数据范围为止。

在传播过程中,每次都将光线经过的像素颜色累积到最终的像素颜色中,从而得到物体的阴影效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Key words 3D reconstruction; OpenGL; ray casting algorithm; transform matrix; tri-linear interpolation; visualization; volume rendering
可视化技术[1]将数据中的信息以图像的方式直 观表达出来,使很多抽象的、难于理解的原理和规 律变得容易理解。直接体绘制算法是诸多可视化算 法中重要的一种,它将三维空间的离散数据直接转 换成二维图像,而不必生成中间几何图元,以反映 数据场中各种信息的综合分布情况。
因此,体数据场的精确投影区域就可以被确定,
从 Bounds[height][2] 区域发出的每条光线几乎都会
与体数据场相交,既避免了无效的光线投射,又不
会出现有效光线的遗漏。
612
电子科技大学学报
第 37 卷
2 数据场的法线编码和明暗表计算
为了提高光线投射算法的交互性和减少每束光
线的计算量,将数据场每个体素的光照计算作为预
第 37 卷 第 4 期 2008年7月
电子科技大学学报 Journal of University of Electronic Science and Technology of China
Vol.37 No.4 Jul. 2008
关于光线投射算法的OpenGL高效实现
解 梅,景孝凯
(电子科技大学电子工程学院 成都 610054)
影坐标,将投影和规范化合并。该变换矩阵为:
⎡ ⎢ ⎢
cot
⎛ ⎜⎝
θ 2
⎞ ⎟⎠
⎢A

M v2n
=
⎢ ⎢
0

⎢0

⎢⎣ 0
0
cot
⎛ ⎜⎝
θ 2
⎞ ⎟⎠
0
0
0
0
Znear + Zfar Znear − Zfar
−1


0⎥


0⎥


2Znear Zfar
⎥ ⎥
Znear − Zfar ⎥
0
⎥⎦
(2)
函数void glViewport(GLint x, GLint y, GLsizei w,
GLsizei h)设置观察窗口,即建立规范化坐标到屏幕
坐标的变换矩阵。该变换矩阵为:
⎡ x1 − x2
⎢ ⎢
2
0
0
x1 + x2 ⎤
2
⎥ ⎥

M n2s
=
⎢ ⎢
0
y1 − y2 2
0
y1 + y2 ⎥
2
⎥ ⎥
XIE Mei and JING Xiao-kai
(School of Electronic Engineering, University of Electronic Science and Technology of China Chengdu 610054)
Abstract The paper use mainly ray casting algorithm to convert the 2D image to 3D image. We use tri-linear interpolation algorithm to calculate the color and opacity of the sampling in order to improve the accuracy of 3 D reconstruction. The algorithm caculates the accurate projective region of 3D regular data field based on the OpenGL library and its 3D view matrices. Consequently it reduces the amount of rays in ray casting algorithm. This method also computes shading tables for the data field in advance according to the light of phone illumination model. In addition, the regular implementation codes of the algorithm are optimized. These stategies work together to speed up the ray casting volume rendering algorithm effectively. The algorithm improve not only the accuracy of 3D reconstruction but also the effective of 3D reconstruction.
能较好地反映数据场的整体结构,通过适当调节参 数,可以很好地显示局部细节。它的主要缺点是计 算量较大,影响图像质量的因素多且相互关联,难 以实现和用户的实时交互。本文利用OpenGL矩阵快 速计算数据场在屏幕空间的精确投影,避免了无效 区域的光线投射;采用预先为数据场计算明暗表的 方法来减少算法实现中的大量计算;在程序实现的 常规代码上给予有效的优化。实验表明,上述措施 能有效地提高光线投射算法的效率,使直接体绘制 可以在当前主流PC机接近实时显示。
示。对于无穷远光源,L是常量,而观察方向V在通
常情况下也为常量。因此Phone光照模型在物体表面
特性一致和光源特性不改变的情况下,仅存在一个
变量,即物体表面单位法向量N,这也是可以作为
数据场生成明暗表的依据。
N L
V P
图2 Phone光照模型示意图
2.2 数据场体素的法向量计算和法线编码
一般采用中心差分法为体素计算法向量,对体
体绘制[2-5]有物空间绘制、像空间绘制和频域绘 制等多种方法,基于像空间的光线投射算法是体绘 制中最常用的算法,其基本思想是从图像平面的每 个像素点发出一条采样光线穿过体素空间,按照一 定的采样步长进行采样;由各种内插算法计算每个 采样点的颜色值和不透明度,然后由前至后进行图 像合成,直到光线穿过体数据场或者被完全吸收。 算法过程包括梯度计算、物质分类、明暗度计算、 重采样和图像合成。光线投射算法[6-10]的主要优点是
处理部分,这样投射光线或者改变传递函数时,甚
至在模型旋转过程中,都只需要作简单的合成运算
即可,而不需要为相关体素重新计算光照。
2.1 Phone光照模型
本文采取最常用的Phone光照模型为每个体素
计算光照,Phone模型的明暗度为:
S (v)
=
Ia Ka
+
Ip
Kd (L ⋅
N ) + Ks (N r+k
【摘要】采用光线投射算法对二维(2D)图片实现三维(3D)重建,用3线性插值算法计算每个采样点的颜色值和不透明度,
提高三维重建图像后的精度。该算法实现主要借助于OpenGL函数库及其三维观察矩阵,以其精确计算规则三维数据场在观察
方向上的二维投影区域,减少了光线投射算法中投射光线数量。根据Phone光照模型为数据场预先计算和保存明暗表,并通过
e1 − c1, e2 − c2 ) ;V = (u0 ,u1,u2 ) ; P0 为世界坐标系中
原点到观察坐标系原点的向量,一般有 P0 =
(e0 , e1, e2 ) 。
MC
建模变换
WC
观察变换
VC
投影变换 窗口变换
PC
规范化/裁剪
NC
D
图1 一般的三维变换流水线
函 数 void gluPerspective(GLdouble θ , GLdouble A, GLdouble Znear ,GLdouble Zfar )建立了 一个透视投影矩阵,即将观察坐标转换为规范化投
步加以限制,首先建立一个以屏幕矩形的高度为大
小 的 二 维 数 组 Bounds[height][2] , 其 中 ,
Bounds[i][0] 和 Bounds[i][1] 分别存储体数据场的
精确投影区域在第 i 行屏幕处的起始坐标和结束坐
标。该数组的计算方法如下:
(1) 计算体数据场的12条棱在屏幕上的投影直

H )n
(6)
式中 Ia为环境光;Ka为环境光因数;Ip为光源强度; Kd为漫反射系数;L为入射光单位法向量的反方向; N为表面单位法向量;Ks为镜面反射系数;H为镜面 反射方向向量, H = (L +V ) / | L +V | ;V为观察方
向单位向量的反方向;n为光洁度因子;r为物体离
观察点的距离;k为常数。明暗度计算模型如图2所
景孝凯(1981 − ),男,硕士
第4期
解 梅 等: 关于光线投射算法的OpenGL高效实现
611
察操作,将模型坐标系中的点变换到屏幕上的像素, 一般的三维变换流水线如图1所示。
在图1中,MC、WC、VC、PC、NC、DC分别 为模型坐标、世界坐标、观察坐标、投影坐标、规 范化坐标和设备坐标。OpenGL中的坐标变换都是通 过与相应的矩阵相乘来实现,OpenGL中的重要观察 函数为:
换矩阵为:
⎡ux uy uz −u ⋅ P0 ⎤
M w2v
=
⎢ ⎢
vx
⎢ ⎢
nx
vy ny
vz nz
−v

P0
⎥ ⎥
−n

P0
⎥ ⎥
(1)
⎣0 0 0 1 ⎦
式 中 n = N / | N |= (nx , ny , nz ) ; u = V × N / |V |=
相关文档
最新文档