渲染管线概述

什么是渲染

渲染可以认为是软件由模型生成图像的过程。

可以分为预渲染(Pre-rendering)或者实时渲染(real-time rendering)。

渲染管线

完成渲染的流水线,具体的实现细节依赖于使用的软硬件。

按照RTR4的划分方式:

应用程序阶段

剔除(Culling)

  • 视锥体剔除(Frustum Culling)。根据Field of Value(FOV), Clipping Planes(远近裁面)决定的视锥体进行裁剪。如果没有和视锥体相交,模型就不会被看到。通常为了简化面数较多的物体,会设置bounding box进行和视锥体的碰撞检测
  • 层级剔除(Layer Culling Mask),没有被设置在Culling Mask上的层级中的物体不会被渲染。
  • 遮挡剔除(Occlusion Culling)

排序

  • 渲染队列 RenderQueue,在材质球上设置,数值小的先渲染

  • 在这里插入图片描述

    如果同值:

    • 小于2500的在不透明队列,按离摄像机距离从前到后

    • 大于2500的在半透明队列,按摄像机距离从后向前

    这样配置是为了优化,不透明的渲染,被前面挡住的部分就可以不处理了;但半透明必须从后向前,保证渲染顺序的正确性。

打包数据Batch

模型信息:

  • 顶点坐标
  • 法线
  • UV
  • 切线
  • 顶点色
  • 索引列表

变换矩阵

灯光、材质参数:

  • Shader
  • 材质参数
  • 灯光信息

绘制调用DrawCall

SetPass Call设置渲染状态,Draw Call告诉GPU使用的模型数据

GPU 渲染管线

几何阶段(Geometry)

Vertex Shader & Projection

顶点着色器最终要的任务就是将顶点坐标从Model Space变换到Clipping Space,然后交给裁剪阶段进行裁剪。

在变换到Clipiping Space的过程中,顶点会经历三个矩阵的变换,这三个矩阵分别为Model Matrix, View Martix和Projection Matrix,合称MVP矩阵。(都是4维方阵)

World Space就是整个场景的坐标,在场景中唯一

View Space又称Camera Space,以相机为原点,相机朝向为z负方向的坐标系

Projection将View Volume变换为标准立方体,有两种形式:透视Perspective和正交Orthographic。投影虽然名字叫投影,但此时还没有进行3D到2D的过程,只是为后面的投影做准备,相当于归一化。

Clipping

只有完全在View Volume的部分才会被传入光栅化阶段,而只有部分在视体内的图元才需要进行裁剪,从而获得位于视体内的新的三角形顶点。

在这里插入图片描述

在上一步使用投影矩阵变换到Clip Space的目的,就是为了便于裁剪,进行投影变换后,图元只需要对照单位立方体进行裁剪即可。

裁剪阶段使用的坐标是4维齐次的(齐次意思是次数相等),如果使用的是透视投影,插值方法可能不是线性的,使用4维坐标的也是为了进行透视插值。在进行**透视除法(perspective division)**后,图元会转换3维的NDC坐标(Normalized device coordinates,归一化设备坐标,不同设备环境的NDC可能不一样)。

区分剔除Culling和裁剪Cliping,剔除是以模型体为单位的,裁剪操作针对三角图元。

剔除的结果是视锥体外的模型会直接剔除,裁剪操作会产生新的顶点和三角面。

Back Face Culling

在变换到屏幕坐标之前,还会进行背面剔除操作,剔除掉背对着相机的三角面。判断三角面的方向使用的是顶点索引的顺逆时针。顺时针为背面,逆时针为正面。背面剔除的目的是剔除会被遮挡的图元,提升渲染速度。

Screen Mapping

将NDC坐标转换为屏幕的坐标系(只针对xy坐标),z轴坐标作为depth深度信息。

根据设备和环境的不同,转换后的屏幕坐标系有很多类型,例如OpenGL的(0,0)在左下,而Direct X的在左上。

光栅化(Rasterization)

光栅化阶段的主要任务就是找出所有位于三角形内部的pixel(Picture elements),并渲染这些pixel。包括Triangle Setup(也叫Primitive Assemly)和Triangle Traversal两部分。因为这一步要将所有的2D顶点——这些顶点包含z轴depth以及其他着色信息——转换为屏幕空间上的pixel,所以也被称为扫描转换(Scan Conversion)。

Triangle Setup

也叫图元装配(Primitive Assemly),将顶点连成线,组成平面。

计算三角形的边表达式,以及其他数据。这些数据用于下一步Triangle Traversal,以及计算不同着色数据的插值。

Triangle Traversal

计算哪些片元位于三角形内部。

每个片元的属性都使用三角形顶点的数据插值而成,这些属性包含深度信息和其他着色信息。

深度信息就是NDC中的z轴,用来处理遮挡关系,这个值是必须有的。

首先会对边上的片元进行线性插值,然后进行逐行扫描(Scanline)。

片元处理(Pixel Processing)

逐个处理片元中的像素。

Pixel Shader

使用插值过的颜色数据,生成一个或多个颜色数据传递给Merging阶段。

最主要的任务是纹理技术Texturing和光照技术Lighting。

纹理技术

  • 纹理采样。通过纹理坐标映射到纹素地址的像素值。

  • 纹理过滤。通过双线性插值等算法进行浮点纹素地址的采样

在这里插入图片描述

  • Mipmap。纹理链,针对原图生成大小不同的一组图像,不同大小区域使用不同大小图像,从而减少大图像映射到小图像引起的失真

  • 纹理寻址模式。当纹理坐标超出范围的时候的处理机制(例如填充纯色)。

  • 纹理压缩格式。对图像质量有直接影响。

光照计算

  • 光照组成

    • 直接光照。光线到达物体表面后,经过一次反射到达人眼
    • 间接光照。多次反射到达人眼。间接光照计算量很大,所以实时目前应用少。
  • 光照模型。因为BRDF双向反射分布函数太过复杂,所以通常会用经验模型,例如Phong模型。

    Phong模型认为物体光照由漫反射Diffuse,镜面反射光Specular和环境光Ambient组成

    • 漫反射:各个方向的反射颜色相等,反射光强度由反射光和法线夹角决定,夹角用点乘计算。

    • 镜面反射:法线等角分布,光照强度由观察者方向和反射光线夹角决定,同时,用光滑度Smooth(图中的sh)来设置衰减范围

    • 环境光。可以认为是间接光照,有很多种算法。

Merging

处理遮挡关系和半透明混合。通过一系列测试决定片元是否要渲染和混合。

alpha test用于剔除透明度较低的图元。

Depth test用于处理图元的可见性,使用Color buffer和Depth buffer(也叫z buffer)。

深度测试可以在Vertex shader之后,Pixel shader之前,这种提前的深度测试称为Early-Z,用于提前剔除被遮挡的片元。Early-Z只适用于不透明,同时需要硬件支持。

Stencil buffer记录已经渲染的图元的位置,缓冲的内容可以用来控制Color buffer和Depth buffer中的渲染。

Depth buffer, Color buffer和Stencil buffer合称帧缓冲Frame buffer。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Recitative

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值