《Unity Shader 入门精要》学习笔记(一)——渲染流水线

最近在掌握了一些图形学基础后,下定决心要学习一下Shader相关内容,加之平时开发一些游戏Demo基本上基于Unity实现,于是搬出来《Unity Shader 入门精要》开始研读,顺便整理一下笔记加深理解。
本文主要是在每章学习后,首先凭印象整理出大致框架和重点概念,之后再参照原文进行校对勘误,如此一来加深了理解同时又能保证知识的准确性。

渲染流水线

渲染流水线就是将一幅画面渲染的过程拆分为多个阶段,每个阶段执行各自功能同时可以并行计算以提高速度。由于采用了流水线模式,因此整个渲染过程的耗时基本上取决于整条流水线中速度最慢的步骤。

概念上的渲染流水线主要分为三个阶段:应用阶段、几何阶段、光栅化阶段
他们只是从概念上将渲染流水线划分为三个主要步骤,实际GPU的流水线步骤会更加细化。

应用阶段

应用阶段是用户可编程程度最高的步骤,通常是由CPU负责的部分。这个阶段主要任务是:

  1. 准备好场景数据(包括需要渲染的物体、摄像机角度等)
  2. 进行粗粒度的剔除(剔除被遮挡的物体,与光栅化阶段有所不同)
  3. 设置每个模型的渲染状态(包括使用的材质、纹理、shader等)

该阶段的最终输出就是渲染所需的几何信息,即渲染图元,重点是三维信息!

几何阶段

几何阶段的主要工作是将上一步的渲染图元进行逐顶点、逐边的操作。
通俗来说就是决定需要绘制的图元是什么,绘制在什么位置,如何绘制等等。

这里的遮挡计算与应用阶段不同,应用阶段进行的是粗粒度的剔除,即完全被遮挡的物体会直接被剔除,以减少之后几何阶段的计算等。而几何阶段则需要计算各图元之间的部分遮挡,即一个图元哪些部分被遮挡不需绘制,哪些部分未被遮挡需要绘制。

其中最重要的一项工作就是将顶点坐标转换到屏幕空间中。
该阶段通常在GPU上进行,最终输出是屏幕空间的二维顶点坐标、每个顶点的相关信息等,重点是二维信息!

光栅化阶段

光栅化阶段主要使用上一阶段提供的数据来产生屏幕上的像素。
这个阶段的主要任务是决定每个渲染图元中的哪些像素需要被绘制出来,这里需要用到上阶段提供的逐顶点信息,进行插值,进行逐像素的处理。

CPU与GPU的通信

通过上面我们了解到渲染流水线的开始是应用阶段,而应用阶段主要是由CPU进行,因此整个渲染过程也是由CPU发起,之后交由GPU进行处理。主要分为三个阶段:

  1. 加载数据至显存(硬盘->内存->显存)
  2. 设置渲染状态(使用的材质、纹理、shader等)
  3. 发起DrawCall,告诉GPU已经准备好渲染所需信息,可以开始工作啦

下一节主要整理关于GPU流水线的主要步骤和重点功能。

你可能感兴趣的:(《Unity Shader 入门精要》学习笔记(一)——渲染流水线)