Unity Shader初学——《Unity Shader入门摘要》

版权声明:欢迎交流,本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42513339/article/details/83239843

由于项目需要加上本人兴趣,所以开始学习shader相关知识。主要参考冯乐乐的《Unity Shader入门摘要》

作者的博客在此:https://blog.csdn.net/candycat1992

作者的个人网站:http://candycat1992.github.io/

书籍的源代码、勘误以及Unity3D的版本更新:https://github.com/candycat1992/Unity_Shaders_Book


首先,Unity Shaer在国内的相关资料很少,这本书是在看到作者博客的时候看到的,作者的博客写的十分有深度,也易于理解,最近也正好项目中可能遇到,所以开始学习这本书。

基础知识:因为书籍中会说到一些图形学相关的名词,我这里也罗列了一些可以参考:https://blog.csdn.net/weixin_42513339/article/details/82852562


综述

什么是渲染流水线?

渲染流水线的工作任务在于由一个三维场景出发、生成(或者说渲染)一张二维图像。(有CPU和GPU完成)

渲染流程可以分成3个阶段:应用阶段(Application Stage)、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer Stage)。(如下图所示)

其中每个阶段本身通常也是一个流水线系统。

æ¦å¿µæµæ°´çº¿.png-16.9kB

应用阶段

由CPU负责,开发者有绝对控制权。

开发者在这一阶段,有三个任务:1.准备好场景数据(模型、光源等)。2.为了提高渲染性能,做一个粗粒度剔除工作(culling),把不可见的物体剔除出去。3.设置好每一个模型的渲染状态(材质、纹理、shader等)。

输出渲染所需要的几何信息,即渲染图元(点线面等)。然后进入下一阶段——几何阶段。

几何阶段

有GPU负责,主要处理所有和我们要绘制的几何相关的事情。如:绘制的图元是什么?怎么绘制?

几何阶段负责和每个渲染图元打交道,进行逐定点、逐多边形的操作。这里可以分成很多流水线(下文讲)。

几何阶段的重要任务:把顶点坐标变换到屏幕空间中,再交给光栅器处理。(这一阶段会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息)

光栅化阶段

GPU负责,使用上一阶段传递的数据来产生屏幕上的像素,并最终渲染出最终的图像。

主要任务:决定每个渲染图元中哪些像素应该被绘制在屏幕上。它需要对上一个阶段得到的逐顶点数据(如纹理坐标、顶点颜色等)进行插值,然后进行逐像素处理。

CPU与GPU之间的通信

渲染流水线的起点是CPU,即应用阶段,分成下面3个阶段:

  1. 把数据加载到显存中。
  2. 设置渲染状态。
  3. 调用Draw Call

数据加载到显存

渲染数据需要从 硬盘(HHD)加载到系统内存(RAM)。然后,网格和纹理等数据又会被加载到显卡上的存储空间——显存(VRAM)。这是因为显卡对显存的访问速度更快,而且大多数显卡对 RAM 没有直接的访问权利。

当数据加载到显存中后,RAM中的数据就可以移除了,但是对于一些数据,CPU仍要访问,所以这些数据未被移除。

设置渲染状态

通俗的解释:渲染状态定义了场景中的网络是怎么样被渲染的。(如使用的顶点着色器、片元着色器、光源属性、材质)等

准备完成过后,CPU便会调用渲染命令:Draw Call来使GPU开始渲染。

Draw Call

Draw Call是一个命令。发起方是CPU,接收方是GPU。这个命令仅仅会指向一个需要被渲染的图元列表。

当给定了一个Draw Call时,GPU会根据渲染状态(材质、纹理、着色器等)和所以输入的顶点数据来进行计算,最终输出屏幕上显示的那些漂亮的像素。这个过程就是GPU流水线

猜你喜欢

转载自blog.csdn.net/weixin_42513339/article/details/83239843