您的位置:首页 > 移动开发 > Unity3D

Unity Shader 四 渲染管线

2016-06-11 22:54 483 查看
         转眼间一晃已经好长时间了,好像很长的时间都没有更新了哈哈(别扔我鸡蛋。。。。。)。这段时间事情挺多,主要是因为工作的需要转而去研究计算机图形学去了,不得不说计算机图形学果然是博大精深,让我研究的一筹莫展(囧)。

         哈哈,研究了很长时间的填充算法,画线算法,例如DDA,扫描线,种子填充,我这个时候发现快到一个死胡同里面了。以前写Shader只是注意它的效果随便就从网上拉个例子下来并不很理解其中的原理。

         之前在像公司里面的一个大神学习的时候,我发现原来一直没怎么注重的渲染管线原来其实是个很重要的东西,学习Shader的好坏很大程度上面其实要靠对于渲染管线的总体理解,因为Shader毕竟也只是渲染管线中的一环而已。渲染管线主要分为三个阶段:应用程序阶段、几何阶段、光栅阶段。 

         应用程序阶段就比如我们在Unity里开发了一个游戏,其实很多底层的东西Unity都帮我们实现好了,例如碰撞检测、视锥剪裁等等,这个阶段主要是和CPU、内存打交道,在把该计算的都计算完以后,在这个阶段的末端,这些计算好的数据(顶点坐标、法向量、纹理坐标、纹理)就会通过数据总线传给图形硬件,作为我们进一步处理的源数据。 

         几何阶段主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,改阶段基于GPU进行运算,在该阶段的末端得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标。简而言之,几何阶段的主要工作就是“变换三维顶点坐标”和“光照计算”。 

         问题随之而来,为什么要变换顶点坐标?我是这么理解的,比如你有一个三维游戏场景,场景中的每个模型都可以用一个向量来确定它的位置,但如何让计算机根据这些坐标把模型正确的、有层次的画在屏幕上?这就是我们需要变换三维顶点坐标的原因,最终目的就是让GPU可以将这些三维数据绘制到二维屏幕上。 

        


          

光栅化阶段,经过上面的步骤之后,我们得到了每个点的屏幕坐标值,和我们需要绘制的图元,但此时还有两个问题: 

(1)屏幕坐标是浮点数,但像素是用整数来表示的,如何确定屏幕坐标值所对应的像素? 

(2)如何根据已确定位置的点,在屏幕上画出线段或者三角形? 

对于问题1,绘制的位置只能接近两指定端点间的实际线段位置,例如,一条线段的位置是(10.48, 20.51),转换为像素位置就是(10,21)。 

问题2,涉及到具体的画线和填充算法,有兴趣的话可以研究。 

这个过程结束后,顶点和图元已经对应到像素,之后的流程就是如何处理像素,即给像素赋予颜色值。 

给像素赋予颜色的阶段称为Pixel Operation,是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目的是计算出每个像素的颜色值。在这个阶段,被遮挡的面通过一个被称为深度测试的过程消除。 

pixel operation包含下面这些流程: 

(1)消除遮挡面; 

(2)Texture operation,纹理操作,根据像素的纹理坐标,查询对应的纹理值; 

(3)Blending,通常称为alpha blending,根据目前已经画好的颜色,与正在计算的颜色的alpha值混合,形成新的颜色。 

(4)Filtering,将正在计算的颜色经过某种滤镜后输出。 

该阶段之后,像素的颜色值被写入帧缓存中。 

           其实只有懂得更多的深层次的知识才能熟练的把握shader,而且其实从另外一个层次来说我们要学习的并不单单是shader,而是实时渲染。

           今天就先写到这里了,欢迎大家来群里跟我交流,群号: 344682050
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unity3D shader