扫描线z-buffer消隐算法思想与数据结构

从冯结青老师上的图形学课件上摘录:

基本思想
开两个一维数组xresolotion分别作为当前扫描线的z缓冲器和帧缓冲器
在处理当前扫描线时
  • 帧缓冲器的初值取背景颜色
  • z缓冲器的初始值取为最小z值
求出该扫描线与场景中各多边形的二维投影之间的交点
一条扫描线与一个多边形有偶数个交点,对每对交点之间的像素计算其深度值,与z缓冲中的值比较,若可见,将该多边形的属性写入帧缓冲器,更新z-buffer中的深度值
当场景中的所有多边形处理完毕时,扫描线帧缓冲器中的内容为画面在此扫描线的消隐结果
数据结构
分类多边形表:根据多边形最大y坐标ymax将多边形放入相应类中
  • a,b,c,d:多边形所在平面方程系数 ax+by+cz+d=0
  • id:多边形编号
  • dy:多边形跨越的扫描线数目
  • color:多边形的颜色
分类边表:根据边的上端点y坐标ymax将边放入到相应类中
  • x:边的上端点的x坐标
  • dx:相邻两条扫描线交点的x坐标差dx(-1/k)
  • dy:边跨越的扫描线数目
  • ID:边所属多边形的编号
中间数据结构
活化多边形表:记录当前扫描线与多边形在oxy平面上投影相交的多边形
  • a,b,c,d:多边形所在平面方程系数 ax+by+cz+d=0
  • id:多边形编号
  • dy:多边形跨越的剩余扫描线数目
  • color:多边形的颜色
活化边表:存放多边形投影边界与扫描线相交的边对
  • xl:左交点的x坐标
  • dxl:左交点边界上两相邻扫描线交点x坐标的差值
  • dyl:左交点剩余跨越扫描线数目
  • xr,dxr,dyr为右交点同上类似
  • zl:左交点处多边形所在平面深度值
  • dzx:沿扫描线向右走一个像素时,多边形所在平面的深度增量。对于平面方程,dzx=-a/c(c≠0);
  • dzy:沿y方向向下移过一根扫描线时,多边形所在平面的深度增量。对于平面方程,dzy=b/c;
  • id:交点对所在的多边形编号
算法描述
首先建立分类的多边形表和边表
扫描顺序从上到下:在处理最上面一条扫描线前,活化的多边形表和边表是空的
在处理每条扫描线前,作如下工作:
把帧缓冲器的相应行置成底色
把z缓冲器的各个单元置成最小值(表示离视点最远)
检查分类的多边形表,如果有新的多边形涉及该扫描线,则把它放入活化的多边形表中
如果有新的多边形加入到活化多边形表中,则把该多边形在oxy平面上的投影和扫描线相交的边加入到活化边表中
如果有些边在这条扫描线处结束了,而其所在的多边形仍在活化多边形表中,则可以从分类多边形表中找到该多边形在oxy平面上的投影与扫描线相交的新边或边对,修改或加到活化边表中,边对在活化边表中的次序是不重要的
增量式的深度更新:从形成的活化边表中取出一个边对
当前扫描线y,当前位置x(xl<=x<=xr),深度值zx(左交点zx=zl)
每向右前进一个像素:zx=zx+dzx;
比较zx与当前z缓冲器中的Z值
如果zx>z,那么z=zx,将对应像素颜色置为该多边形的颜色
对活化边表中每一个 边对按如上方法处理
活化边表中元素的修改:修改后的活化边表是下一条扫描线的边表
对于每一条边对可计算;
dyl=dyl-1      dyr=dyr-1
若dyl或dyr小于0,相应的边就要从一个边对中去掉,从活化边表中找到合适的边来代替
边和下一条扫描线交点的x值:
xl=xl+dxl xr=xr+dxr
多边形所在平面对应下一条扫描线在x=xl处的深度为
zl=zl+dzldxl+dzy       Q:(dzl  or dzx ?)
活化多边形表中的元素修改
每一个多边形的dy:dy=dy-1
当dy<0时,该多边形要从多边形活化表中删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值