前言

学习Shader就离不开渲染管线,渲染管线是流水线工作的处理形式把3D元素转换到屏幕上2D图像,渲染管线大致分为4个阶段分别是:应用阶段、几何阶段、光栅化阶段、逐片元操作,游戏引擎一般还有一个比较常见的后处理阶段,最后才到输出。

应用阶段

  • 准备基本场景数据
    • 场景物体数据
    • 摄像机数据
    • 光源及阴影数据
    • 其他全局数据
  • 优化(粗粒度剔除、加速算法)
    • 视锥剔除
    • 遮挡剔除
    • 层级剔除
    • 距离剔除
    • 其他算法
  • 设置渲染状态,准备渲染参数
    • 绘制设置(着色器、合批方式)
    • 绘制顺序(相对摄像机距离、材料RenderQueue、UICanvas等等)
    • 渲染目标(FrameBuffer、RenderTexture)
    • 渲染模式(前向渲染、延迟渲染)
  • 调用DrawCall,输出渲染图元到显存
    • 顶点数据(位置、颜色、法线、纹理uv坐标)
    • 其他数据(MVP变化矩阵、纹理贴图等等)

几何阶段

  • 顶点着色器(Vertex Shading)(可编程)
    • 视图转变
    • 顶点着色
  • 投影
    • 正交(NDC中,W等于1)
    • 透视(NDC中,W代表与摄像机的距离,近小远大)
  • 裁剪
    • 视锥体裁剪(CVV)
    • 正面或背面剔除(可配置)
  • 屏幕映射(Screen Mapping)
    • 视口空间坐标会被转换为屏幕坐标,这些坐标直接对应于帧缓冲区中的像素位置。
    • 屏幕坐标的X和Y值决定了像素在屏幕上的水平和垂直位置,而Z值则用于深度缓冲区中的深度信息。

光栅化阶段

  • 三角形设置
    • 设置直线计算边界信息
  • 三角形遍历
    • 遍历填充像素
  • 其他

逐片元操作

  • 片元着色(可编程)
    • 线性插值,求像素颜色
  • 颜色混合
    • 透明度测试
    • 深度测试
    • 模板测试
  • 目标缓冲区
    • 帧缓冲区FrameBuffer
    • 渲染贴图RenderTexture

后处理

  • Bloom
  • HDR
  • 抗锯齿FXAA
  • 景深(Depth of View)
  • 边缘检测
  • 径向模糊

特别说明

图元几何图元渲染图元三个的区别:

  • 图元(Primitive): 这是图形渲染中的基本单位,可以是点、线、三角形等。图元是构成更复杂图形和模型的基础⁴。

  • 几何图元(Geometry Primitive): 这些是由图元组成的,用于描述对象的几何形状。它们是渲染管线中的输入数据,例如顶点数据、纹理坐标、顶点法线和顶点颜色等¹。

  • 渲染图元(Rendering Primitive): 这些是在图形渲染过程中实际被处理的图元。在OpenGL中,渲染图元包括了渲染所需的几何信息,如顶点数据、线段、多边形等,并且它们对应绘图界面上可见的实体⁵。

简单来说,图元是构建几何图元的基本元素,而渲染图元则是在渲染过程中实际被处理和转换成最终图像的元素。

图元

图元(Primitive)是计算机图形学中的一个术语,它指的是构成计算机生成图像(Computer Graphics, CG)的基本形状或对象。图元是图形渲染过程中的最小单位,可以被视为构建更复杂场景的构建块。以下是一些常见的图元类型:

  • 点(Point):最简单的图元,由一个像素组成。
  • 线段(Line):由两个顶点(Vertex)组成的直线。
  • 多边形(Polygon):由多个顶点组成的封闭形状,如三角形、四边形等。
  • 曲线(Curve):由多个点组成的连续线条,可以是贝塞尔曲线、样条曲线等。
  • 曲面(Surface):由多个多边形组成的复杂形状,可以是平面或曲面。
  • 纹理(Texture):虽然不是图元本身,但纹理是图元的一个重要属性,用于在图元表面添加细节和颜色。
  • 体素(Voxel):在三维空间中的体积元素,类似于二维图像中的像素。

DrawCall

在计算机图形学和渲染管线中,Draw Call(绘制调用或绘制命令)是CPU向GPU发出的指令,用于告诉GPU绘制特定的几何图形或图像。一个Draw Call通常包含了一组渲染特定图像所需的全部信息。

NDC

在计算机图形学中,NDC(Normalized Device Coordinates,归一化设备坐标)是一种坐标系统,用于在裁剪空间和屏幕空间之间进行转换。NDC坐标系的特点是其坐标值范围在-1到1之间,这使得它们非常适合用于线性变换和透视除法。

NDC中的XYZW四个分量代表:

  1. X:代表水平方向的坐标,范围从-1到1。在NDC中,-1表示最左边的边界,1表示最右边的边界。

  2. Y:代表垂直方向的坐标,同样范围从-1到1。在NDC中,-1表示最底部的边界,1表示最顶部的边界。请注意,在不同的图形API(如OpenGL和Direct3D)中,Y轴的方向可能相反。

  3. Z:代表深度方向的坐标,也从-1到1。在NDC中,-1通常表示视图的近裁剪平面,而1表示远裁剪平面。

  4. W:这是一个额外的维度,称为齐次坐标(Homogeneous Coordinate)。它通常用于透视除法,以将三维坐标转换为二维坐标。在NDC中,W通常不等于0,因为如果W为0,那么经过透视除法后,X、Y、Z坐标将会变为未定义。

在渲染管线的几何阶段,顶点着色器会输出NDC坐标。然后,这些坐标会经过光栅化阶段,最终转换为屏幕空间坐标,这些屏幕坐标的X和Y分量用于确定像素在帧缓冲区中的位置。

总结来说,NDC坐标系是渲染管线中一个非常关键的步骤,它允许GPU以一种标准化和高效的方式来处理屏幕映射和透视变换。

片元

片元(Pixel) 是图像处理和计算机图形学中的一个基本概念,指的是构成数字图像的基本单元。每个片元代表图像中的一个点,它具有特定的颜色和亮度值。在数字图像中,所有的颜色和细节都是通过这些片元的组合来表示的。

以下是片元的一些关键特性:

  1. 颜色和亮度:每个片元都存储有颜色信息,通常用红、绿、蓝(RGB)三个颜色通道的值来表示,这些值决定了片元的颜色和亮度。

  2. 分辨率:图像的分辨率由其宽度和高度的片元数量决定。分辨率越高,图像的细节越丰富。

  3. 像素密度:像素密度(PPI,Pixels Per Inch)是指每英寸长度内包含的片元数量,它影响图像的清晰度。

  4. 位深度:位深度(Bit Depth)是指每个颜色通道可以存储的位数,它决定了颜色的精度。例如,8位颜色深度可以表示256种颜色,而24位颜色深度可以表示超过1600万种颜色。

  5. 图像格式:不同的图像格式,如JPEG、PNG、GIF等,决定了片元数据的存储和压缩方式。

在计算机图形学中,片元也用于渲染过程,其中3D模型被转换成2D图像。在这个过程中,3D场景中的每个点在投影到2D平面时,都会转换成一个片元,并根据场景的光照、纹理等属性计算其颜色和亮度值。这个过程称为光栅化(Rasterization)。

抗锯齿

  1. SSAA:渲染到一个分辨率放大n倍的buffer,对放大n倍的buffer下采样
  2. MSAA:在光栅化阶段,技术多个覆盖样本
  3. FXAA/TXAA:后处理技术

最后的最后,还在学习中会持续修改更新….