Z-buffer算法

1、Z缓冲区(Z-Buffer)算法

1973年,犹他大学学生艾德·卡姆尔(Edwin Catmull)独 立开发出了能跟踪屏幕上每个像素深度的算法 Z-buffer

Z-buffer让计算机生成复杂图形成为可能。Ed Catmull目 前担任迪士尼动画和皮克斯动画工作室的总裁

Z缓冲器算法也叫深度缓冲器算法,属于图像空间消隐算法

该算法有帧缓冲器和深度缓冲器。对应两个数组:

intensity(x,y)——属性数组(帧缓冲器)

存储图像空间每个可见像素的光强或颜色

depth(x,y)——深度数组(z-buffer)

存放图像空间每个可见像素的z坐标

假定xoy面为投影面,z轴为 观察方向

过屏幕上任意像素点(x,y) 作平行于z轴的射线R,与物 体表面相交于p1和p 2 点

p1和p 2点的z值称为该点的深 度值

z-buffer算法比较p1和p 2的z值, 将最大的z值存入z缓冲器中

显然,p1在p 2前面,屏幕上(x,y) 这一点将显示p1点的颜色

算法思想:先将Z缓冲器中各单元的初始值置为最小值。

当 要改变某个像素的颜色值时,首先检查当前多边形的深度值是否大于该像素原来的深度值(保存在该像素所对应的Z 缓冲器的单元中)

如果大于原来的z值,说明当前多边形更靠近观察点,用它的颜色替换像素原来的颜色

Z-Buffer算法()

{

帧缓存全置为背景色

深度缓存全置为最小z值

for(每一个多边形)

{

扫描转换该多边形

for(该多边形所覆盖的每个象素(x,y) )

{

计算该多边形在该象素的深度值Z(x,y);

if(z(x,y)大于z缓存在(x,y)的值)

{

把z(x,y)存入z缓存中(x,y)处

把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处

}

}

}

}

 z-Buffer算法的优点:

(1)Z-Buffer算法比较简单,也很直观

(2)在象素级上以近物取代远物。与物体在屏幕上的出现 顺序是无关紧要的,有利于硬件实现

z-Buffer算法的缺点:

(1)占用空间大

(2)没有利用图形的相关性与连续性,这是z-buffer算法 的严重缺陷

(3)更为严重的是,该算法是在像素级上的消隐算法

2、只用一个深度缓存变量zb的改进算法

一般认为,z-Buffer算法需要开一个与图象大小相等的缓 存数组ZB,实际上,可以改进算法,只用一个深度缓存变 量zb

z-Buffer算法()
{ 帧缓存全置为背景色
for(屏幕上的每个象素(i,j))
{ 深度缓存变量zb置最小值MinValue
for(多面体上的每个多边形Pk)
{
if(象素点(i,j)在pk的投影多边形之内)
{
计算Pk在(i,j)处的深度值depth;
if(depth大于zb)
{ zb = depth;
indexp = k;(记录多边形的序号)
}
}
}
If(zb != MinValue) 计算多边形Pindexp在交点 (I,j) 处的光照
颜色并显示
}
}

关键问题:判断象素点(i,j)是否在pk的投影多边形之内, 不是一件容易的事。节省了空间但牺牲了时间。

计算机的很多问题就是在时间和空间上找平衡

另一个问题计算多边形Pk在点(i,j)处的深度。设多边 形Pk的平面方程为:

点与多边形的包含性检测:

(1)射线法

由被测点P处向 y = -∞方 向作射线

交点个数是奇数,则被测点在 多边形内部

交点个数是偶数表示在多边形外部

若射线正好经过多边形的顶点,则 采用“左开右闭”的原则来实现

即:当射线与某条边的顶点相交 时,若边在射线的左侧,交点有 效,计数;若边在射线的右侧, 交点无效,不计数

用射线法来判断一个点是否在多边形内的弊端:

(1)计算量大

(2)不稳定

(2)弧长法

以p点为圆心,作单位圆,把边投影到单位圆上,对应一段段 弧长,规定逆时针为正,顺时针为负,计算弧长代数和

代数和为0,点在多边形外部

代数和为2π,点在多边形内部

代数和为π,点在多边形边上

这个算法为什么是稳定的?

假如算出来后代数和不是0,而 是0.2或0.1,

那么基本上可以断定这个点在外部,可以认为 是有计算误差引起的,实际上是0。

但这个算法效率也不高,问题是算弧长并不容易,

因此又 派生出一个新的方法—以顶点符号为基础的弧长累加方法

(3)以顶点符号为基础的弧长累加方法

p是被测点,按照弧长法,p点 的代数和为2π

不要计算角度,做一个规定来 取代原来的弧长计算

同一个象限认为是 0,跨过一个象限是 π/2,跨过二个象限 是 π。

这样当要计算代数和的时候,就不要去投影了,

只 要根据点所在的象限一下子就判断出多少度,这样几乎没 有什么计算量,只有一些简单的判断,效率非常高

小结

z-buffer算法是非常经典和重要的,在图形加速卡和固件 里都有。

只用一个深度缓存变量zb的改进算法虽然减少了 空间,但仍然没考虑相关性和连贯性

原文地址:https://www.cnblogs.com/cnblog-wuran/p/9830994.html

时间: 2024-10-08 01:48:17

Z-buffer算法的相关文章

(转!)Z buffer和W buffer简介

几乎所有目前的 3D 显示芯片都有 Z buffer 或 W buffer.不过,还是常常可以看到有人对 Z buffer 和 W buffer 有一些基本的问题,像是 Z buffer 的用途.Z buffer 和 W buffer 的差别.或是一些精确度上的问题等等.这篇文章的目的就是要简单介绍一下 Z buffer 和 W buffer. Z buffer 和 W buffer 是做什么用的呢?它们的主要目的,就是去除隐藏面,也就是 Hidden surface elimination(或

消隐算法的总结与展望

1 引言 消隐(Hidden Surface Removal)是在一定观察方向下消除不可见的线和面.有时也称为可见性测试.虽然各种消隐算法在可见性测试和不可见面消除方法上区别不大.但这些消隐方法有时还可以一起被统称为不可见面的消除.简称消隐.在三维造型技术.真实感图形的显示.虑拟场景的显示.以及在地形.地图的绘制中.消隐都起到至关重要的作用.所以研究和实现消隐算法,并根据场景的复杂度和各个不同应用领域的场景来提高消隐算法的速度是很有必要的,它对整个三维图形显示.真实感图形的显示以及各种地形地貌图

图形渲染管线简介

The Graphics Rendering Pipeline 渲染管线,这章主要讲光栅化渲染管线. 毕业前实习时,也实现过一个简单的软光栅化渲染管线,再复习一下. 在计算机图形学领域,shading指基于表面相对灯光的角度.距灯光的距离.相对于相机的角度和材质的属性等来修改物体/表面/多边形的颜色,进而创造一个具有真实感效果的过程. In computer graphics, shading refers to the process of altering the color of an o

测试不同格式下depth buffer的精度

这篇文章主要是参考MJP的"Attack of The Depth Buffer",测试不同格式下depth buffer的精度. 测试的depth buffer包含两类: 一是非线性的depth buffer,存储着perspective z(也就是最常用的,透视投影后归一化的z/w的buffer),二是线性的depth buffer,存储着view space z(这里的线性指的是在view space 中是否线性).测试的格式包括16位浮点数,32位浮点数,16位定点数,还有最常

数据结构与算法笔记(1)基本概念

1.什么是数据结构 用计算机解决一个具体的问题,需要以下几个步骤: 从具体问题抽象出一个适当的数学模型: 设计一个解此数学模型的算法: 编出程序: 进行测试.调整直至得到最终解答. 寻求数学模型的实质: 分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述. 很多问题求解最后都转化为求解数学方程或数学方程组.如:求解梁架结构中应力的数学模型为线性方程组.预报人口增长情况的数学模型为微分方程.然而:当计算机进入非数值计算领域,特别是用在管理上的时候,计算机的操作

geohash算法原理及实现方式

1.geohash特点 2.geohash原理 3.geohash的php .python.java.C#实现代码 4.观点讨论 w微博:http://weibo.com/dxl0321 geohash有以下几个特点: 首先,geohash用一个字符串表示经度和纬度两个坐标.某些情况下无法在两列上同时应用索引 (例如MySQL 4之前的版本,Google App Engine的数据层等),利用geohash,只需在一列上应用索引即可. 其次,geohash表示的并不是一个点,而是一个矩形区域.比

BSGS算法+逆元 POJ 2417 Discrete Logging

POJ 2417 Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4860   Accepted: 2211 Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarith

BSGS算法_Baby steps giant steps算法(无扩展)最强详解,你从未见过的详细

Baby Steps-Varsity Giant Step-Astronauts(May'n?椎名慶治) 阅读时可以听听这两首歌,加深对这个算法的理解.(Baby steps少女时代翻唱过,这个原唱反而不是很有名……Giant Step就比较碉,是一个假面骑士片的插曲,由超碉的May'n和一个人建立的临时组合唱的,怕不怕) 这个主要是用来解决这个题: A^x=B(mod C)(C是质数),都是整数,已知A.B.C求x. 我在网上看了好多介绍,觉得他们写得都不够碉,我看不懂…于是我也来写一发. 先

特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)

一.基本概念: 作用:特征点提取在"目标识别.图像拼接.运动跟踪.图像检索.自动定位"等研究中起着重要作用: 主要算法: ?FAST ,Machine Learning forHigh-speed Corner Detection, 2006 ?SIFT,DistinctiveImageFeatures from Scale-Invariant Keypoints,2004,invariant to image translation, scaling, and rotation, p