大致了解Graphics Pipeline
Mesh
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
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 以及 对颜色渐变做差值运算
Fragment Shader: 输入一片一片的fragment,对每个fragment进行着色
texture mapping:把贴图根据UV的位置贴上来Raster Operation: 光栅操作,各种测试
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入门精要(看过这本书之后对这篇博文做了补充和修改)