有关脏矩形与Z-Buffer
近日上网查资料,看到一篇有关脏矩形与Z-Buffer的文章。但是不明白文章结尾的DX对于Z-Buffer的渲染优化。
原文如下:
脏矩形与Z-Buffer,写游戏的朋友们一定要来看看
上次看过云风的《我的编程感悟》,读到里面的脏矩形优化的时候,一直不明白云风为什么说要使用逆向的画家算法。我先解释一下画家算法,懂的可以跳过下面段落
画家算法,顾名思义,就是像画家作画的顺序一样,由远至近的绘制物体,先画远处的,再逐步画近处的,近处的东西画上去后将远处的东西覆盖掉,然后绘 制完成的画就成为了覆盖顺序正确的一幅完美的图画。这就是所谓的画家算法,其实也就是阐述了一个绘制顺序问题,由远至近的绘制。
我相信所有的朋友在制作游戏的前期,一直是在使用着画家算法来绘制图像的,在制作屏幕显示单位不多的情况下,画家算法可以胜任大部分的小游戏的要 求。但是到了大型MMORPG中,如果单纯的使用画家算法,就不能应付N个玩家在一个屏幕上的情况了,那可能会FPS急剧下降,到不可想象的地步。这时 候,就必须使用脏矩形优化了。再讲解一下脏矩形,懂的朋友一样可以跳过:
脏矩形,就是说,在屏幕上的单位,如果某些部分被更新了,那么这个部分就脏了,那么在这个脏矩形范围内的东西将都被更新。也就是说有选择的更新,而不是每次都画全屏的东西。这样的优化可以让程序的速度提升很多,这便是很多游戏中使用的著名的“脏矩形”算法
我再讲一下Z-Buffer,懂的朋友跳过:
Z-Buffer,被称为深度缓冲,听起来很深奥的,实际上很简单,就是对象在屏幕上的远近,值越大就越远,一般情况下Z-Buffer是一个 float(浮点)值,范围在0.0-1.0范围内。Z值小的东西将被绘制在前面,Z值大的东西将被绘制在后面。比如,两个图片,A,B,A的Z为 0.1,B为0.2,则A将覆盖B。
有了Z-Buffer,问题就变得好解决多了,DirectX在判断ZBuffer的时候,会自动忽略不需要绘制的点。那么,首先用逆向画家算法将图像送入渲染管道,然后将它们的Z值按正确的顺序设置
比如,3个图像,分别是A,B,C
C覆盖B覆盖A
那么,绘制时,先正确顺序设置ABC的Z
C覆盖B覆盖A,所以C是最近的,B其次,A最远,那么Z的设置应该为:C<B<A
假设为C的Z为0.1,B为0.2,A为0.3
设置完了Z,再用逆向画家算法送入渲染管道:
RenderC;
RenderB;
RenderA;
由C开始绘制,A最后。
虽然绘制的顺序是逆向的,但是DirectX会自动判断它们的深度缓冲,先绘制的C,再绘制B,绘制B时,有C内容的地方自动会被DirectX忽略不绘制,这样,就让DirectX为我们实现了脏矩形优化
该绘制的地方绘制,不该绘制的地方不绘制。
可能写的不太明白?不过应该可以看懂的,不懂的朋友留言吧,我再修改。
浙公网安备 33010602011771号