![36d0d203750c76550a250ebadc76182d.png](https://img-blog.csdnimg.cn/img_convert/36d0d203750c76550a250ebadc76182d.png)
前言:
Unity Shader的学习的学习路径是非常陡峭的,笔者在学习的时候走了不少歪路,在这里权当分享一下学习过的内容,也是给自己做一个记录了
准备:
- 基本的Unity使用经验
- 天不怕地不怕的心态
枯燥但必须得搞清楚的图形学内容
因为笔者的目的主要是想介绍shader,因此书本上的图形学内容这里就不深入讲了。在传统的图形处理中,我们一般需要两种程序,一个叫Vertex Shader,另一个叫Fragment Shader,他们是一对好伙伴,往后的日子也会时常与他们打交道。
Vertex Shader负责获取处理的网格(Mesh)资讯然后进行处理,比方说我们想渲染一个正方形,那么首先就得先获取这个正方形的位置,纹理等信息,然后做一些矩阵转换传递给Fragment Shader。(关于矩阵转换的事情之后再讲,大概知道有这么回事就好)。
![3b6329e0ab71f0d3ae68da30e2ffb5d2.png](https://img-blog.csdnimg.cn/img_convert/3b6329e0ab71f0d3ae68da30e2ffb5d2.png)
网格中的像素经过处理之后被存储在Fragments中被传给Fragment Shader。当Vertex Shader处理顶点的时候,它会将平均每三个顶点组成一个Fragment,最终整个被处理过的图像被称作Fragments。这个过程用图形学的知识来讲解颇为复杂,有兴趣的读者可以找冯女神的书看看。Fragment Shader其实就是进行核心计算的部分。
![895701e96c022c6a5685c0cc23bbda37.png](https://img-blog.csdnimg.cn/img_convert/895701e96c022c6a5685c0cc23bbda37.png)
自问自答
既然Vertex Shader已经将网格的数据做好了空间转换,那这些信息不是已经可以用了吗?为什么还需要一个Fragment Shader呢不是多此一举吗?哎,别急,听我慢慢解释。这是因为在图像处理当中,我们并不一定需要用到所有的像素数据,因此有些数据需要被修改,而有些则直接弃之不用。比如在我们在实作模糊效果时,其中一种思路便是通过把一个像素周边的像素合并成一个相同颜色的像素实现的,这些内容过于复杂,无法交由CPU来计算,只能由GPU代劳,因此也可以将Vertex Shader看作和CPU打交道的程序,而Fragment则是负责GPU的内容。
![f4b7c3a4390d35fe08f353f3883ff18e.png](https://img-blog.csdnimg.cn/img_convert/f4b7c3a4390d35fe08f353f3883ff18e.png)
于是,在Fragment Shader中,有些像素被保留,而另一些则可能被丢掉,接下来Fragment Shader讲处理好的内容传给颜色缓冲区(Color Buffer),结束了它的工作。后面的内容超出了本文的内容,就不延伸讲了。
我问你答
Vertex Shader的输入从哪里来?
Fragment Shader的输入哪里来?
参考:
candycat1992/Unity_Shaders_Bookgithub.com![56d50ed317f8d053a1f860c9465b186c.png](https://img-blog.csdnimg.cn/img_convert/56d50ed317f8d053a1f860c9465b186c.png)
下一章:
俊銘:Shader从入门到跑路(2):Shader是个万丈深渊zhuanlan.zhihu.com![0590c1bf4e82464b734374bcc1c3ac43.png](https://img-blog.csdnimg.cn/img_convert/0590c1bf4e82464b734374bcc1c3ac43.png)