UnityShader入门精要读后感及总结
UnityShader入门精要读后感及总结
其实该文章我写来更多的意义在于对基础知识的深刻记忆,有助于我对实际开发效果的知识沉淀。
其中分享一下该文章的实现开源demo git地址:Unity_Shaders_Book
一、渲染流水线
这个流水线其实不难理解,任何事务的生产为了提高效率一定是流水线的,而大多数带有显示设备的机器都会通过这种流水线渲染图像并最终让我们看到。
其中的概念阶段分为:应用阶段->几何阶段->光栅化阶段
二、CPU和GPU通信
大体上其实就是描述CPU和GPU的现存是分开的。这里请看书本内容,我就不多做描述。但对于以后深度优化其实有很大的帮助。
1.那么CPU是如何跟GPU通信的呢?这里就涉及到一个重要的指令:DrawCall
2.对于GPU的流水线里,我们能做什么?(精)
下图就非常重要,请仔细阅读
整个渲染流线里包括:顶点数据->顶点着色器->曲面着色器(该着色器手机平台不支持)->几何着色器->裁剪->屏幕映射->三角形设置->三角形遍历->片元着色器->逐片元操作->屏幕图像
而我们日常用到的,大致就是顶点着色器和片元着色器,也就是代码里的vertex和frag
3.顶点着色器(Vertex Shader)(精)
该阶段也是高度可编程的阶段,也是流水线的第一个阶段,它的输入来自于CPU,也就是说仅仅去处理顶点信息的转换,但就这么简单的一个阶段却可以做出无限的变化。
很神奇.几乎所有比较酷炫的效果其实都依赖这个顶点着色器实现,比如海水,扭曲,云啊等等,而渲染流水线中,开放了顶点着色器就相当于给到开发者很大的空间去实现自己想要的各种效果。
提一下的是opengl和directx的坐标系数是不一样的,不过其实unity已经帮我们处理好了。
4.三角形遍历 (精)
这里涉及到一个重要的东西 “片元”,可以理解为,这个片元是遍历三角形后计算出来的一个数据,它是负责记录三角形网格覆盖了哪些像素,并记录插值,及各状态信息,例如屏幕坐标,深度信息等。然后给到另一个非常重要的可编程着色器阶段“片元着色器(Fragment Shader)”
5.片元着色器(Fragment Shader)(精)
片元着色器是一个可变成的着色器阶段,非常重要的一个阶段。
片元着色器可以完成很多重要效果,在这里你可以根据片元中得到的顶点信息,空间信息,屏幕信息,灯光信息等去计算最终的颜色,但它仅可以影响单个片元。
这里要啰嗦一下,因为真的很神奇,你想象一下,有成千上万个小GPU处理单元在并行处理近乎每一个像素的颜色输出,他们都遵循你同一句代码,而这句代码因为在顶点着色器中根据三角形的顶点信息得到的权重,然后就能让你看到形形色色的最终效果。当然,真正复杂的东西其实都是芯片帮你做了。
6.逐片元操作
这个阶段是最后一步了,不能编程,但是可以高度配置。
这里模板测试,深度测试,混合,都讲解的非常多,但其实可以理解为工厂做东西的最后一步质量检测,通过各种参数的对比,去得到不同的处理结果。其处理方式归结为针对片元的可见性及混合模式。可见性和混合其实是两种处理阶段,不可见,就没后面啥事了。值得一提的是,GPU会做一些优化,例如深度测试就会在片元着色器之前,避免无谓的计算
流水线很复杂,但是Unity在底层其实帮我们做了很多事情,我们只需要关注我们可编程的阶段及可配置的阶段进行控制就可以实现出想要的效果了
7.Draw Call
强大而又常见的词汇,这是CPU跟GPU通信的指令,简而言之,DrawCall越少越好。
这里值得一提,合批技术最近除了Instance Batch,这是一种完全依赖GPU进行合批的新技术。