渲染管线
前言
学习Shader就离不开渲染管线,渲染管线是流水线工作的处理形式把3D元素转换到屏幕上2D图像,渲染管线大致分为4个阶段分别是:应用阶段、几何阶段、光栅化阶段、逐片元操作,游戏引擎一般还有一个比较常见的后处理阶段,最后才到输出。
应用阶段
- 准备基本场景数据
- 场景物体数据
- 摄像机数据
- 光源及阴影数据
- 其他全局数据
- 优化(粗粒度剔除、加速算法)
- 视锥剔除
- 遮挡剔除
- 层级剔除
- 距离剔除
- 其他算法
- 设置渲染状态,准备渲染参数
- 绘制设置(着色器、合批方式)
- 绘制顺序(相对摄像机距离、材料RenderQueue、UICanvas等等)
- 渲染目标(FrameBuffer、RenderTexture)
- 渲染模式(前向渲染、延迟渲染)
- 调用DrawCall,输出渲染图元到显存
- 顶点数据(位置、颜色、法线、纹理uv坐标)
- 其他数据(MVP变化矩阵、纹理贴图等等)
几何阶段
- 顶点着色器(Vertex Shading)(可编程)
- 视图转变
- 顶点着色
- 投影
- 裁剪
- 视锥体裁剪(CVV)
- 正面或背面剔除(可配置)
- 屏幕映射(Screen Mapping)
- 视口空间坐标会被转换为屏幕坐标,这些坐标直接对应于帧缓冲区中的像素位置。
- 屏幕坐标的X和Y值决定了像素在屏幕上的水平和垂直位置,而Z值则用于深度缓冲区中的深度信息。
光栅化阶段
- 三角形设置
- 设置直线计算边界信息
- 三角形遍历
- 遍历填充像素
- 其他
- 抗锯齿(MSAA)
逐片元操作
- 片元着色(可编程)
- 线性插值,求像素颜色
- 颜色混合
- 透明度测试
- 深度测试
- 模板测试
- 目标缓冲区
- 帧缓冲区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四个分量代表:
X:代表水平方向的坐标,范围从-1到1。在NDC中,-1表示最左边的边界,1表示最右边的边界。
Y:代表垂直方向的坐标,同样范围从-1到1。在NDC中,-1表示最底部的边界,1表示最顶部的边界。请注意,在不同的图形API(如OpenGL和Direct3D)中,Y轴的方向可能相反。
Z:代表深度方向的坐标,也从-1到1。在NDC中,-1通常表示视图的近裁剪平面,而1表示远裁剪平面。
W:这是一个额外的维度,称为齐次坐标(Homogeneous Coordinate)。它通常用于透视除法,以将三维坐标转换为二维坐标。在NDC中,W通常不等于0,因为如果W为0,那么经过透视除法后,X、Y、Z坐标将会变为未定义。
在渲染管线的几何阶段,顶点着色器会输出NDC坐标。然后,这些坐标会经过光栅化阶段,最终转换为屏幕空间坐标,这些屏幕坐标的X和Y分量用于确定像素在帧缓冲区中的位置。
总结来说,NDC坐标系是渲染管线中一个非常关键的步骤,它允许GPU以一种标准化和高效的方式来处理屏幕映射和透视变换。
片元
片元(Pixel) 是图像处理和计算机图形学中的一个基本概念,指的是构成数字图像的基本单元。每个片元代表图像中的一个点,它具有特定的颜色和亮度值。在数字图像中,所有的颜色和细节都是通过这些片元的组合来表示的。
以下是片元的一些关键特性:
颜色和亮度:每个片元都存储有颜色信息,通常用红、绿、蓝(RGB)三个颜色通道的值来表示,这些值决定了片元的颜色和亮度。
分辨率:图像的分辨率由其宽度和高度的片元数量决定。分辨率越高,图像的细节越丰富。
像素密度:像素密度(PPI,Pixels Per Inch)是指每英寸长度内包含的片元数量,它影响图像的清晰度。
位深度:位深度(Bit Depth)是指每个颜色通道可以存储的位数,它决定了颜色的精度。例如,8位颜色深度可以表示256种颜色,而24位颜色深度可以表示超过1600万种颜色。
图像格式:不同的图像格式,如JPEG、PNG、GIF等,决定了片元数据的存储和压缩方式。
在计算机图形学中,片元也用于渲染过程,其中3D模型被转换成2D图像。在这个过程中,3D场景中的每个点在投影到2D平面时,都会转换成一个片元,并根据场景的光照、纹理等属性计算其颜色和亮度值。这个过程称为光栅化(Rasterization)。
抗锯齿
- SSAA:渲染到一个分辨率放大n倍的buffer,对放大n倍的buffer下采样
- MSAA:在光栅化阶段,技术多个覆盖样本
- FXAA/TXAA:后处理技术