3D图形渲染完整流水线

  1. 建立场景
  • 在真正开始渲染之前,需要对整个场景进行预先设置,如摄像机视角、灯光设置及雾化设置等。
  1. 可见性检测
  • 有了摄像机就可以基于摄像机视角检测场场景中所有物体的可见性,这一步在实时渲染中极为重要,因为可以避免把时间和性能浪费在渲染一些视角之外的物体上。
  1. 设置渲染状态
  • 一旦检测到某个物体时可见的,接下来就需要把它绘制出来了。但是由于不同物体的渲染状态可能不同(如何进行深度测试、如何与背景图像进行混合等),因此在开始渲染该物体之前需要设置物体的渲染状态。
  1. 几何体生成与提交
  • 接着,就需要向渲染API提交几何体数据了,一般所提交的数据为三角形的顶点数据。例如:顶点坐标、法向向量、UV等。
  1. 变换与光照
  • 当渲染API获取到顶点数据之后,就需要将顶点坐标从模型空间变换到摄像机空间,并同时进行顶点光照计算。
  1. 背面剔除与裁切
  • 变换到摄像机空间之后,那些背对着摄像机的三角形会被剔除(消隐),然后再被变换到裁切空间,将视椎体之外的部分裁切掉。
  1. 投射到屏幕空间
  • 在裁切空间中经过裁切之后的多边形会通过投影从三维变为平面,输出到屏幕空间中。
  1. 光栅化
  • 屏幕空间的几何体还需要进行光栅化处理才能转变为2D的像素信息。
  1. 像素着色
  • 最后,计算每个像素的颜色,并把这些颜色信息输出到屏幕上。

空间变换

  • 模型空间(本地空间)+ 模型变换 -> 世界空间
  • 世界空间 + 视变换 -> 摄像机空间(观察空间)
  • 摄像机空间 + 投影变换 -> 裁切空间
  • 裁切空间 + 屏幕投影 -> 屏幕空间 选择合适的坐标空间对物体进行描述有利于简化空间计算。

现代GPU渲染流水线

OPENGL为例:

顶点数据->顶点着色器->装配图元->光栅化->片段着色器->测试和混合->帧缓存

其中顶点着色器和片段着色器开放给用户自定义,顶点着色器将顶点坐标由模型空间变换到裁切空间,片段着色器用来计算每一个像素的颜色(包括光照,阴影,纹理等)。

Shader实际上就是渲染流水线的一部分,主要由顶点着色器和片段着色器组成,常用编写语言有HLSL(Direct3D),GLSL(OpenGL),CG(MicroSoft),Unity中首选CG,URP中首选HLSL。

Shader和材质的关系与区别

Shader本质是程序,加上参数设置和贴图资源打包最终得到的就是材质,材质是Shader的实例化资源,一个Shader可以实例化成多个材质,并调节为不同的材质效果。