13-消隐算法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面消隐算法的分类
第一类(图像空间的消隐算法):以窗口内 的每个像素为处理单元;
for (窗口内的每一个像素) { 确定距视点最近的物体,以该物体表面的颜色 来显示像素}
假设场景中有k个物体,平均每个物体表面 由h个多边形构成,显示区域中有m x n个 像素,则: 算法的复杂度为:O(mnkh)
面消隐算法的分类
Main Topics
Classification of Visible-Surface Detection Methods Back-Face Detection Depth-Buffer Method A-Buffer Method Scan-Line Method Depth-Sorting Method BSP-Tree Method Area-Subdivision Method Octree Methods Ray-Casting Method Curved-Surfaces WireFrame Visiblity Method OpenGL Visibility-Detection Functions
将帧缓冲区置为背景值, (1)将帧缓冲区置为背景值,深度缓冲区置为最小的 深度值。即对所有的(x y), <=x<=M(x, <=y<=N深度值。即对所有的(x,y),0<=x<=M-1,0<=y<=Nframe(x,y)=背景值 zbuffer(x,y)=最小的 背景值. 最小的z l,令frame(x,y)=背景值.zbuffer(x,y)=最小的z 对要显示的物体、作预先指定的观察变换, (2)对要显示的物体、作预先指定的观察变换,使物 体表面上的任一点.总和某个像素位置(x y)相对 体表面上的任一点.总和某个像素位置(x v y)相对 而且总可以知道该点对应的深度z(x y)。 z(x, 应,而且总可以知道该点对应的深度z(x,y)。逐个 以任意次序、 对物体表面上的每一点, 以任意次序 、 对物体表面上的每一点 , 完成以下任 务 a.假定当前所讨论的点对应像素位置为(x.y), 假定当前所讨论的点对应像素位置为(x.y), (x 因此,可以确定该点的深度z(x y),该点的色彩或灰 z(x, 因此,可以确定该点的深度z(x,y),该点的色彩或灰 I(x. 度I(x.y) 如果z(x,y)>zbuffer(x,y) 那么将z(x y)置 z(x,y)>zbuffer(x,y), z(x, b.如果z(x,y)>zbuffer(x,y),那么将 z(x,y)置 zbuffer(x,y),同时I(x y)也置入frame(x,y)。 I(x, 也置入frame(x 入zbuffer(x,y),同时I(x,y)也置入frame(x,y)。 否则, 否则,不作任何操作
9.2 Back-Face Detection
ObjectA Simple and Fast Object-Space Methods InsideInside-Outside Test equation,Ax+By+Cz+D=0 Plane equation,Ax+By+Cz+D=0 Ax+By+Cz+D<0 点 在 平 面 内 Ax+By+Cz+D<0; 点 在 平 面 外 N=(A,B,C) Ax+By+Cz+D>0 Ax+By+Cz+D>0 z
由于深度缓存区需要大量的存储空间,因此这个算法并不总 由于深度缓存区需要大量的存储空间, 是现实的、例如对于500 500个像素的光栅显示器 500x 个像素的光栅显示器, 是现实的、例如对于500x500个像素的光栅显示器,深度缓冲 区就需要250000个存储单元。为了克服这个缺点, 250000个存储单元 区就需要 250000 个存储单元 。 为了克服这个缺点 , 减少所需 的存储量,可以把图像空间划分成许多较小的区域, 的存储量 ,可以把图像空间划分成许多较小的区域, 然后将 深度缓冲区算法依次地应用于每个小区域。 例如. 深度缓冲区算法依次地应用于每个小区域 。 例如 . 原来是 500x500的光栅,可以划分成100个小区域,每个小区域具有 500x500的光栅, 可以划分成100个小区域, 的光栅 100 个小区域 50×50个像素 这样处理这个小区域就只需要具有2500 个像素, 2500个存 50×50 个像素 , 这样处理这个小区域就只需要具有 2500 个存 储单元的深度缓冲区。自然,这样做, 储单元的深度缓冲区。 自然 , 这样做, 每个多边形可能要处 理多次.以至增加了算法执行的时间。 理多次 .以至增加了算法执行的时间。 还可以采取另一种方 即分成100个水平段,每段高5条扫描线, 500个像素 100个水平段 个像素。 法,即分成100个水平段,每段高5条扫描线,宽500个像素。 在极端的情况下,可以为每条扫描线提供一个深度缓冲区, 在极端的情况下, 可以为每条扫描线提供一个深度缓冲区, 分别处理500条扫描线。从而可以利用扫描线相关性等特性, 500条扫描线 分别处理500条扫描线。从而可以利用扫描线相关性等特性, 减少算法的执行时间。当然.由于这个算法的简单, 减少算法的执行时间。 当然 . 由于这个算法的简单, 更由于 大规模集成电路技术的飞速发展.存储器价格大幅度的下跌, 大规模集成电路技术的飞速发展.存储器价格大幅度的下跌, 因此深度缓冲区算法越来越为大家所接收, 因此深度缓冲区算法越来越为大家所接收,应用也越来越广
9.Visible-Surface Detection Methods
目的:通过检测可见面,消除隐藏线和隐藏面, 目的:通过检测可见面,消除隐藏线和隐藏面, 以在二维平面上显示具有真实感图形。 以在二维平面上显示具有真实感图形。 消除隐藏线和隐藏面, 消除隐藏线和隐藏面,是计算机图形学中比较因 难但又是十分关键的一个问题。 难但又是十分关键的一个问题。消隐算法是决定 相对于空间给定位置的观察者,哪些线、 相对于空间给定位置的观察者,哪些线、表面或 物体是可见的,哪些是不可见的。 物体是可见的,哪些是不可见的。本章主要展示 和计论一些最常用的隐藏线和隐藏面的消隐方法 及技术。 及技术。
9.3 Depth-Buffer Method
Z缓冲区算法或称深度缓冲区算法 所有图像空间消隐算法个原理最简单的一种, 所有图像空间消隐算法个原理最简单的一种, 是由catmull 1975年提出的 catmull在 年提出的, 是由catmull在1975年提出的,适用于正投影时的消隐处理 基本思想是.对于显示屏上的每个像素.记录下位于此像素上 基本思想是. 对于显示屏上的每个像素. 最靠近观察者的一个对象的深度, 最靠近观察者的一个对象的深度, 通过深度的比较来决定该对 象可见或不可见。为此.我们不仅有存储每一像素点亮度或色 象可见或不可见。 为此. 彩的帧缓冲器frame frame, 彩的帧缓冲器frame,还要设置一个用于存储每一像素点所显示 对象深度的缓冲区,称为Z缓冲区或深度缓冲区。可见, 对象深度的缓冲区,称为Z缓冲区或深度缓冲区。可见,深度缓 冲区是帧缓冲区的简单推广。假定显示器的分辨率是M 冲区是帧缓冲区的简单推广。 假定显示器的分辨率是M×N , 则 两个缓冲区的大小均为M 两个缓冲区的大小均为M×N, 但每个像素位置所需用的字节数 可以不同,根据实际情况来确定, 可以不同, 根据实际情况来确定, 如深度缓冲区每位的字节数 根据z坐标的大小或精度来确定。因此, 根据z坐标的大小或精度来确定。因此,如果我们仍然假定视点 在右手坐标系z轴正向无穷远处, 在右手坐标系z轴正向无穷远处,则用深度缓冲区算法来实现消 隐的基本过程如下: 隐的基本过程如下:
Basic Concepts
投影变换失去了深度信息, 投影变换失去了深度信息,往往导致图 形的二义性
要消除二义性, 要消除二义性,就必须在绘制时消除被遮挡 的不可见的线或面, 的不可见的线或面,习惯上称作消除隐藏线 和隐藏面,简称为消隐。 和隐藏面,简称为消隐。
经过消隐得到的投影图称为物体的真实 图形。 图形。
第二类(物体空间的消隐算法 ):以场景中的 物体为处理单元;
for (场景中的每一个物体) { 将其与场景中的其它物体比较,确定其表面的可见部 分; 显示该物体表面的可见部分; }
假设场景中有k个物体,平均每个物体表面由h个 多边形构成,显示区域中有m x n个像素,则: 算法的复杂度为:O((kh)*(kh))
提高消隐算法效率的常见方法
利用连贯性 将透视投影转换成平行投影 包围盒技术 背面剔除 空间分割技术 物体分层表示
提高消隐算法效率的常见方法1
利用连贯性:相邻事物的属性之间有一 定的连贯性,其属性值通常是平缓过渡 的,如颜色值、空间位置关系等。 物体连贯性 面的连贯性 区域连贯性 扫描线的连贯性 深度连贯性
x y
BackBack-Face N>0 V.N>0 如果V(观察者在Z V(观察者在 且观察射线与Z平行) 如果V(观察者在Z轴,且观察射线与Z平行),则 V=(0 V=(0,0,Vz) N=VzC; 我们只考虑平面法向量N V.N=VzC; 我们只考虑平面法向量 N 的 C 分量的符 号 考虑如图,如果C小于0 则为Back Face. Back考虑如图,如果C小于0,则为Back-Face.
9.1 Classification
到目前为止,已经提出了很多有效的消隐算法,这 到目前为止,已经提出了很多有效的消隐算法, 些算法可以依据算法实现时所在的坐标系或空间进 行分类, 行分类,一般可分成两大类 对象空间算法(object (objectmethods); (1) 对象空间算法 (object-space methods) ; 在对 象定义时所处的坐标系中实现。 象定义时所处的坐标系中实现。这种方法把物体和 物体的某些部分彼此比较,通过有关几何运算, 物体的某些部分彼此比较,通过有关几何运算,以 确定哪些线或表面是不可见的.然后仅显示可见线, 确定哪些线或表面是不可见的.然后仅显示可见线, 以此实现消隐,这种算法精度较高, 以此实现消隐,这种算法精度较高,生成的图形可 以放大多倍而仍然令人满意, 以放大多倍而仍然令人满意,适用于精密的工程应 用领域
图像空间算法(image (imagemethods); (2) 图像空间算法 (image-space methods); 在显示 图形的屏幕座标系中实现。 图形的屏幕座标系中实现。这种方法是对投影平面 或显示屏幕上的每一个像素位置逐点地检测其可见 这种算法比较粗糙. 性。这种算法比较粗糙.而且按图像空间算法得到 的画面在放大后往往不能令人满意。 的画面在放大后往往不能令人满意。但这种算法计 算效率比较高, 算效率比较高,因为在光栅扫描过程中可以充分利 用画面的连贯性等性质。因此. 用画面的连贯性等性质。因此.有许多方法是在图 像空间中实现的 两个方法一般都利用排序和连贯性来提高算法性能, 两个方法一般都利用排序和连贯性来提高算法性能, 排序主要用在深度比较, 排序主要用在深度比较,而连贯性利用图形的规则 Scan-Line。 性,如Scan-Line。
Z缓冲器算法是所有图像空间算法中最简 单的一种隐藏面消除算法。它在象素级 上以近物取代远物,与形体在屏幕上的 出现顺序无关。 优点:1)简单稳定,利于硬件实现
2)不需要整个场景的几何数据
缺点: 1)需要一个额外的Z缓冲器
2)在每个多边形占据的每个像素处都 要计算深度值,计算量大
消除隐藏线
对造型的要求
提高消隐算法效率的常见方法1
物体连贯性:如果物体A与物体B是完全相互分 离的,则在消隐时,只需比较A、B两物体之间 的遮挡关系就可以了,无须对它们的表面多边 形逐一进行测试。例如,若A距视点较B远,则 在测试B上的表面的可见性时,无须考虑A的表 面。 面的连贯性:一张面内的各种属性值一般都是 缓慢变化的,允许采用增量形式对其进行计算。 区域连贯性:区域指屏幕上一组相邻的像素, 它们通常为同一个可见面所占据,可见性相同。 区域连贯性表现在一条扫描线上即为扫描线上 的每个区间内只有一个面可见。
在线框显示模型中,要求造型系统中有面的 信息,最好有体的信息。
坐标变换
将视点变换到Z轴的正无穷大处,视线方向 变为Z轴的负方向。
最基本的运算
判断面对线的遮挡关系.反复地进行线线、 线面之间的求交运算
面消隐
面消缓冲器算法 区域子分算法 光线投射算法