stage3d编程-基础4 关于渲染管线深度测试投影等

  8点才到家,饿着肚子开始写。昨天给出了一个demo。但是那个demo里面有很多新的东西,今天就简要说明一下,我会在后续把那个demo里面所有出现的名词全部解释一遍。然后开始讲解有关agal等等。

  1、后台缓冲区

  gpu在绘制模型完之后,会维护一个后台缓冲区(backbuffer)。所有的最终显示出来的颜色会根据一定的规则被放在后台缓冲区里面。当我们调用context3d.present()方法的时候,就是在通知gpu将后台缓冲区的数据显示出来。所有大家只要知道,这个缓冲区里面的数据将是我们最终看到的。在配置后台缓冲区的时候,我们需要指定一个大小,以及抗锯齿等级。抗锯齿越高,精度就越高,那么显示出来的越精细。

  2、深度测试

  gpu里面维护了一个zbuffer。也就是深度值。这个用来干什么呢?首先请想一个问题。眺望远方,你会发现,前面的物体把后面的挡住了,后面没有被挡住的部分显示出来了。那么这个过程如何在3d里面模拟实现呢?这个时候就需要一个东西来记录每一个物体的距离,然后根据距离来决定显示显示哪一个。在gpu里面,因此就维护了一个zbuffer。这个zbuffer是和像素挂钩的。也就是说每一个像素都有一个zbuffer。现在我们假设有四个物体:

  

   离得最近的是求,其次是椎体,再次是圆环,最后是圆柱体。大家看demo其实就可以发现,在每一帧开始的时候,都调用了context3d.clear方法,这个方法会清掉深度值也就是zbuffer。zbuffer的值的范围在0-1之间,调用clear的时候可以重设depth的值,也就是重置成你设置的值,默认呢就是1。 现在我们来模拟一下这个算法。假设我们使用小于的判断方式。那么:

   1、绘制圆柱体:  深度值d1 < 1 检测通过,将像素写入后台缓冲区(用到后台缓冲区了噢),除了这个圆柱体以外的地方深度值仍然是1,所以仍然是clear时指定的颜色

   2、绘制圆环:     深度值d2 < d1并且d2 < 1,检测通过,将颜色写入后台缓冲区,圆柱体有一部分被圆环像素替代了。

   3、绘制圆球,        深度值d3 < d2并且d3 < 1,检测通过,将颜色写入后台缓冲区,圆环有一部分被圆球像素替代了。

         4、绘制椎体          深度值d4,  d4 > d3并且d4 < d2, d4 < 1,那么原先圆球所在的那一部分呢,检测是不通过的,像素也就不会被写入了,但是呢,除了圆球的部分,其它检测都是通过的,它又会覆盖别人的。因此呢,圆锥体所在圆球部分不会写入圆锥体的像素,表现出来的仍然是圆球。

   那么深度检测呢,这个过程就是这样的。后台缓冲区就是用来存放最终的信息的。关于模板测试,以后再讲。

   

   3、投影:perspective

   关于perspective大家可以看看这个文章http://www.adobe.com/devnet/flashplayer/articles/perspective-projection.html。

     

   大家观察上图就可以发现,越远,铁路看起来越窄。但是真实情况下,铁路并没有变窄,只是我们看起来变窄了而已。为了在3d世界中模拟这个效果,就需要一种算法来实现。之前就提到3d世界中,所有的变换都是基于矩阵的。因此我们需要提供一个这样的矩阵,坐标 * 矩阵 -> 上诉效果。现在再来看3d世界中,关于这个实现的流程:

  

    eye位置呢,就是我们相机的位置。我们看出去呢,肯定有一个最近的裁面,比这个更近的呢,我们就看不到了,那么也有一个远裁面,比这更远的呢,我们也看不到了。我们看到的只是这个两个裁面中间的物体。我们看出的是一个椎体。距离越长,看到的就越多。但是在计算机中,我们要在屏幕中显示看到的内容,所有呢还需要一个称之为投影窗口的东西。

    

     大家注意看,越远的物体呢,经过我们的眼睛看出去然后投影到投影窗口里面去, 那个物体就变小了。那么这个过程呢,也就实现了之前我们谈到的看火车情况。然后用横切面图看观测这个,就会发现其实通过最简单的三角函数就可以计算出相关的量了。

    

      

    𝑟=𝑤/h =𝑤/2 ⟹𝑤=2𝑟 

    tan(𝛼/2) = 1/𝑑⟹ 𝑑 = cot(𝛼/2)

    tan(𝛽/2)=r/𝑑= 𝑟/cot(a/2) =r∙tan(𝛼/2) 

    所以只要给出垂直视域角 𝛼 和横纵比 𝑟,我们就能求出水平视域角 𝛽。 。。。。。我只是提一下,大家要是有兴趣,就去看之前给出的那个链接,里面的那个老外详细的给出实现过程。最终将会组成一个matrix3d用于做投影这个事情。大家可以去翻看adobe包下面的perspectivematrix的源码。

    4、渲染管线问题

    之前的demo里面提到,modelMatrix,viewMatrix...这几个的顺序不能交换,交换了就会出错。这个是什么原因呢。给大家看一下dx里面的渲染管线顺序。在opengl里面也是大同小异。

    

 

  大家观察就会发现,第二个,第三个,第七个。他们的顺序。因为gpu在处理的时候呢,是根据某种顺序来处理的,因此呢,我们必须得遵守这个规则。至于为何将这个几个矩阵相乘之后就可以了,我也不知道。。。关于这个是不是这样的。。。大家如果觉得错了请回复指出。

  

  关于那个projection。大家有心可以去翻看away3d的源码。https://github.com/away3d/away3d-core-fp11/tree/master/src/away3d/cameras/lenses。away还提供其他的projection。例如全景等方式。大家可以去看看,也就是说,我们可以通过设置projection的算法来实现不光是perspective这种投影方式。明天要是有空,就开始简要谈一下agal以及上传到显卡的各种buffer。吃饭去了。。。

 

 

 

posted on 2013-09-12 21:17  boblchen  阅读(893)  评论(0)    收藏  举报