Learn Unity Shader 1

大致了解Graphics Pipeline

Mesh

avatar
Mesh是一个点,法向量,面的集合,它定义了一个3D物体的形状(可了解一下Mesh的数据结构)

CPU to GPU

  • 把数据加载到显存中
  • 设置渲染状态
  • 调用Draw Call

Simple Graphics Pipeline

Hello Triangle这一章首次介绍了Graphics Pipeline, 不过是个简化版
$$
\begin{eqnarray}
Vertex Data \quad \rightarrow \quad Vertex Shader \quad \rightarrow \quad Shape Assembly \quad \rightarrow \quad Geometry Shader
\end{eqnarray}
$$
$$
\begin{eqnarray}
\rightarrow \quad Rasterization \quad \rightarrow \quad Fragment Shader \quad \rightarrow \quad Tests and blending
\end{eqnarray}
$$

于是去了解了一下详细版本的图形渲染管线

Programmable Graphics Pipeline

avatar

Application Stage

物体在应用层,正要把Mesh传入GPU前端
输入:Geometry Primitives(图元)
  即一到多个顶点、线段、几何体
  Vertex Data
  包括Vertex position
    Vertex normal vector
    Vertex color
    Texture coordinate(UV)贴图位置
输出到GPU

Geometry Stage
  • Vertex Shader: 对于输入进来的每个顶点都会调用顶点着色器。它本身不会创建或者销毁任何顶点,而且无法得知顶点间的联系。但是这样的独立性和适合GPU,可以并行处理大量顶点。
      包括Operates vertices改变顶点位置
        Vertex transformation(Model-View-Projection)
        Texture coordinate transformations贴图位置转换
        Per-vertex lighting
      其中Vertex transformation的流程为:
    $$
    \begin{eqnarray}
    object/local space \quad \underrightarrow{\text{ modelling transformation }} \quad world space \quad \underrightarrow{\text{ viewing transformation }}
    \end{eqnarray}
    $$
    $$
    \begin{eqnarray}
    view/eye space \quad \underrightarrow{\text{ projection transformation }} \quad clip space
    \end{eqnarray}
    $$
      之后在Perspective Frustum(截头视椎体)中做透视除法,将坐标转换到Normalized Device Coordinates(NDC,归一化坐标)中。注意Unity中除了观察空间是右手坐标系之外,其他都是左手坐标系。所以viewing transformation matrix和projection transformation matrix都是会改变空间旋向性的。

  • Primitive Assembly:   把顶点装配成三角形

  • Tessellation Shader:   图元细分,是可选项

  • Geometry Shader:   几何着色器,也是可选项。基本做的是顶点的增减,性能较差因为不像VS和FS那样高度并行。是继VS、FS之后,由Shader Model 4(第四代显卡着色架构)正式引入的第三个着色器。具体可参考Refrence第三条。

  • Clipping:   把NDC之外的剔除

  • Screen Mapping:   3D的点转化到2D

Rasterization Stage
  • Rasterization & Interpolation:   把三角形的区域变成一片一片的fragment 以及 对颜色渐变做差值运算
    avatar

  • Fragment Shader:   输入一片一片的fragment,对每个fragment进行着色
      texture mapping:把贴图根据UV的位置贴上来

  • Raster Operation:   光栅操作,各种测试
    avatar
      Early-Z:把Depth test提前到fragment前,节省FS需要处理的片元
      Double Buffering:一个buffer正在用于屏幕绘制,一个buffer正在被写入数据

Reference
1、http://www.youtube.com/watch?v=fhmf5PacfVg&list=PLxMD5A4JpjsouiyE14Jag6TceLeJyIZ7h
2、http://learnopengl-cn.github.io/
3、http://gad.qq.com/article/detail/14718
4、Unity Shader入门精要(看过这本书之后对这篇博文做了补充和修改)