ShaderLab教程系列(二)

文章来自http://www.manew.com/thread-43291-1-1.html 

上一篇最后引出了shader存在的意义是为了让二维屏幕绘制出栩栩如生的三维场景。此处进一步补充说明该观点。
      首先,我们先来思考我们现实中是如何让外部景物在我们的脑子中成像的。作为软件开发的我们,务必永远记住一点,这个世界是最合理最严谨的存在,如果你遇到你的业务逻辑无法理清,那么,就去看看现实世界是如何运作的,忘记那些所谓高深的数学之类的东西,软件编程,没有高深的技巧,永远别被那些所谓的算法工程师吓到,其实,就是忽悠,包括shader这边,后续要撕逼的各种光照模型,其数学物理知识可谓简单到高中生都理解基本无难度。
      我们看到一个物体 
      1)  第一个要点是要有光。
      2)  第二个要点是我们要有眼睛
      3)  第三个要点是确实存在物件。
      4)  第四个要点是我们要有脑子,进行后续各种经验性纠正处理。
      通俗点说,我们看到纷杂丰富的世界是因为这些各式各样的物体反射太阳光或者自己发射光进入我们的眼睛投影到视网膜上,然后这些视觉信号传输到大脑,大脑进行后续各种经验型纠正,然后最后在脑海中形成一幅图像。
      那么,软件是怎么模拟这个事情的。软件的模拟永远是模拟,即尽量去仿真,但绝不是妄图完全重现,软件只是软件,我们需要考虑我们当前的资源,然后抓取这个事务中重要的部分,按照重要程度进行依次仿真。
      1)  光:从自然界中我们抽取了点光源(模拟灯泡)、聚光灯(模拟手电筒)、平行光(模拟太阳光)以及环境光(各向无差异)。
 

点光源

聚光灯

平行光

      2)  眼睛:摄像机。摄像机所看到的就是相当于我们眼睛看到的,此时我们都是独眼龙。此处提供了两种相机,正交(远景与近景一样大小)与透视(存在透视点,所有地平线最后相交于透视点)。
      3)  物件:gameobject = mesh+material
      4)  脑子:渲染机制各种处理,保证渲染出来的效果符合预期。

      现在整个解决方案域的模型已经建好了,下面就是具体问题解决的流水线了。即三维信息到底如何从CPU到达GPU最后在屏幕上展示出来。

      如图所示,应用程序将数据信息准备好,通过3D API将数据送交GPU,GPU将数据进行各种变换处理后进行渲染输出。

      GPU与CPU存在架构上的区别。如下图:

      从图中可以看出GPU为高并发性结构,存在多个处理器同时工作,GPU的控制单元以及寄存器明显少于CPU,但这货具有大量的逻辑运算单元,数说明GPU的强处在于数值处理,而非高速缓存与流控制。通俗点说,CPU在一个时刻只能处理一个数据(单核CPU),而GPU可以同时处理多个数据。

      GPU采用的是流式并行计算,对每个数据独立计算。通俗点说就是计算一个顶点的世界位置坐标,不依赖于其他顶点的位置,多个数据可以同时被使用,多个数据并行运算的时间和1 个数据单独执行的时间是一样的。其编码与CPU存在明显的差异。见下图

      那么为何GPU需要如此设置。我们思考下对于1920*1080像素尺寸的屏幕进行帧刷新处理,如果场景中存在4kw个顶点,每个顶点需要进行100次运算,最后刷新到像素,每个像素点需要进行5次运算,那么我们需要运算的次数就是100*4kw+5*1920*1080,哪怕采取双缓冲机制,一个水桶的容量取决于最短的那块木板,最后为了满足人的体验,每秒刷新帧数在60次,那么需要进行的计算高达一亿,每两个脉冲可以完成一次独立的计算,那么需要我们的主频必须十亿赫兹,也就是1Ghz,这个代价太大。于是先贤整出了GPU。

     模型到底如何渲染出来。无外乎颜色的渲染,而渲染效果的好坏在于这些颜色的计算。对于如何仿真这些颜色,让其效果更逼近现实,我们此处无非依然是参照现实世界。我们之所以看到一个物体,是因为该物体发射或者反射光线进入我们的眼镜,现实世界如此,那么,软件仿真世界也比不过如此。我们采取的解决方案是计算光线、自发光等等各种因素影响下的顶点的颜色,然后顶点之间插值计算,从而得到每一个面的颜色分布,最终展示出真实的效果。所以,shader你又可以理解为光照,他处理的无非就是各种光线问题,如漫反射、高光、自发光、半透明等等。

      数学模型建好之后,下一步就是具体的实施,此处有一个名字如雷贯耳,渲染管。数据如何从CPU流转到GPU,GPU如何一步步计算最终在屏幕上展示,这个工作流水线是预定的,参见下图。而shader只是开放出来的一个脚本,用于将具体的渲染的一些效果控制交给开发者进行二次开发。      

      那么shader存在的意义到底如何?其出现的更多的原因个人觉得是硬件的发展使然,以前硬件渣的时候,那么,CPU只能调用GPU提供的API,进行简单的参数调整渲染出其实还算可以的效果。随着硬件的发展,大家越来越不满足受制于人的感觉,于是,开始了可编程图形元件,即提供了shader这个脚本,而这个脚本由两个部分组成,顶点与片段,分别对应渲染管线中两个片段,这样你就可以做出各种你希望的效果,如显示外围轮廓等等。

       实际上,我们shader主要用于更逼真的显示效果,所以,shader你又可以理解为基于物体本身属性和光照条件,计算每个像素的颜色值。当然,如果你用于各种非常规效果的话,那么,就另当别论了。

猜你喜欢

转载自blog.csdn.net/allen807733144/article/details/83864869