Transcript 4.ch1.(消隐).
下述OpenGL函数的功能?
gluLookAt(0, 0, 10,
0, 0, 0,
0, 1, 0);
gluPerspective(60.0, (float)w/(float)h, 1.0,
300.0);
glOrtho(left, right, bottom, top, zNear, zFar );
(主视图,俯视图,左视图三个基本视图)
为三视图
1
消隐算法
2
主要内容
消隐的基本概念
背面剔除算法
油画家算法
z缓冲器(z-buffer)算法
3
消隐的基本概念
消隐的基本概念(隐藏面消除):相对于观察
者,确定场景中哪些物体是可见或部分可见
的,哪些物体是不可见的
消隐可以增加图形的真实感
投影:三维二维
二维平面:通过确定物体的前后关系,可以获
得更多信息
消隐是图形学中非常重要的一个基本问题
4
消隐的基本概念
5
消隐的基本概念
消隐问题本身的复杂性导致许多不同的算法,
其中很多算法是对于特定问题设计的
在实时模拟过程中,要求消隐算法速度快,生
成的图形质量一般
在真实感图形生成过程中,要求生成高质量的
图形,此时消隐算法速度较慢
在算法设计时,往往需要在消隐效率和图形
质量之间进行权衡
6
消隐的分类方法
算法实现时所在的坐标系(空间)进行分类 :
景物空间消隐
特点:算法精度高,与显示器的分辨率无关,适合于精
密的CAD工程领域
算法复杂度为O(n2):场景中每一个物体都要和场景
中其他的物体进行排序比较,n为物体个数
代表方法:背面剔除,油画家算法
图像空间消隐
特点:在屏幕坐标系中进行,生成的图像受限于显示器
的分辨率
算法复杂度为O(nN):场景中每一个物体要和屏幕中
每一个像素排序比较, n为物体个数,N为像素个数
代表方法:z缓冲器算法
7
背面剔除算法
原理:利用观察方向(V)和物体表面法向(N)
之间的关系
NV0:θ<90 不可见
NV<0:θ>90 可见
8
背面剔除算法
背面剔除算法:适用于凸多面体,不适用于
凹多面体或其它复杂物体
9
背面剔除算法
背面剔除算法适用于场景消隐的预处理:消
除一些显然不可见的表面,从而提高其他消
隐算法的效率。
10
油画家算法算法
3
1
6
z
11
深度排序算法
深度排序算法适合于固定视点的消隐
在一些视点频繁变化的场合中,例如飞行模拟,上
述算法的效率就不能满足实时性的要求。
12
z缓冲器算法
z (深度)缓冲器算法属于图像空间算法
z缓冲器GL_DEPTH_BUFFER_BIT是帧缓冲器的推广
帧缓冲器:存储的是像素的颜色属性
z缓冲器:存储的是对应像素的z值
假设在视点坐标系(oxyz)中,投影平面为
z=0,视线方向沿-z轴方向
深度值就是物体沿视线方向、与视点的距离
离视点近的物体遮挡离视点远的物体:
z值越大,离视点越近
13
z缓冲器算法
屏幕
帧缓冲器
每个单元存放对应
象素的颜色值
Z缓冲器
每个单元存放对应
象素的深度值
14
z缓冲器算法分析
z缓冲器需要占用大量的存储单元
一个大规模复杂场景中:深度范围可能为106,
一个像素需要24bit来存储其深度信息。如果
显示分辨率为500×500,那么深度缓冲器需
要1MB的额外存储空间!
解决方法:分区域z缓冲器算法
Z缓冲器的单元数
逐个区域地进行z缓冲器消隐,这样z缓冲
只要等于一条扫描
器的大小就仅为一个子区域的大小
线内像素的个数
子区域为扫描线时:
扫描线z缓冲器算法+连贯性
15
活化边表
两个空间多边形在oxy
平面上的投影
16
预习
lianxi1.12.4.c 中display()函数中设置
不同视点的方法
17