渲染核心两步:
1. position the vertices
2. color the pixels
Unity Shader核心分为三个模块
1. vertices shader(用于捕捉渲染物体的空间位置,后投影至所处的屏幕位置)
2. fragment shader(确认在vertices shader内,进行着色,通常用rgba)
3. z-buffering(计算shader所生效对象到相机的距离,用于着色器的叠加展示,通常由渲染器本身进行计算)
在Shader中,每个顶点和像素都是相互独立计算的(GPU的并行逻辑),所以在写Shader的Workpipline中,与以往的编程逻辑不同
概念性阶段的渲染流水线:
应用阶段 → 几何阶段 → 光栅化阶段
以上每个阶段本身可能就是个流水线系统
应用阶段(核由开发者负责)
开发者主要三个任务
1. 准备场景数据:例如相机位置、视锥体、光源信息
2. 提升渲染性能:例如粗颗粒度剔除、不可视物剔除
3. 设置面片渲染状态:使用的材质、纹理、shader
这一阶段输出渲染几何信息——渲染图元(可以是点线面)
几何阶段
处理所有需要绘制的集合事件,包括以下几个步骤
1. 决定需要绘制的图元
2. 怎样绘制?在哪儿绘制?
通常在GPU上进行任务,核心任务是将顶点坐标换算到屏幕空间坐标中。
输出屏幕空间中的二维顶点坐标,每个顶点对应的深度值、着色等相关信息。
光栅化阶段
依赖几何阶段数据,产生屏幕像素。决定哪些像素被绘制,如何绘制(纹理坐标,顶点颜色,计算插值)
!!以上三个阶段为概念流水,与真实的GPU流水计算不同