前言

渲染管线的流程是什么样的?像素缓冲区和垂直同步是干什么的?渲染一个模型到显示器上经历了几个坐标系?旋转中欧拉角和四元数的关系?下面就让我们一起来学习下吧。


渲染管线

一、应用阶段

应用阶段是由CPU进行的,主要是准备场景数据,剔除不可见物体,设置好渲染状态。
应用阶段
应用阶段会把数据从硬盘加载到显存中,设置渲染状态,将渲染设置传给GPU,最后CPU调用Draw Call命令GPU进行渲染。
Draw Call


二、几何阶段

几何阶段是GPU渲染流水线的第一个阶段。
几何阶段

1)顶点着色器

  • 顶点着色器不可以创建和销毁顶点,无法得到顶点之间的关系,所以GPU可以并行化处理每一个顶点。
  • 主要进行坐标变换逐顶点光照
  • 在此可以更改顶点法线相关的信息。

2)曲面细分着色器

  • 主要用于细分图元,优化曲面,使曲面更光滑,非必要。

3)几何着色器

  • 主要用于逐图元的着色操作,或者被用于产生更多的图元
  • 输入输出都是图元

3)变换回执

  • 当下一帧渲染时,可以读取上一帧的图元数据。主要是用了缓冲区去决定数据是否按先前的流程光栅化。
  • 优点:降低CPU和GPU的通信消耗

4)裁剪

图片

  • 图元根据视域的平截头体进行可见性判断,简单来说就是视野外的顶点被舍弃,与舍弃顶点连线的三角形边会与平截头体求交点,这些交点是新的顶点。

5)屏幕映射

在这里插入图片描述

  • 主要是将坐标从齐次裁剪空间变换到屏幕空间,z坐标不进行处理
  • 注意OpenGL和DirectX的屏幕坐标是有差异的:(0,0)位置的坐标,OpenGL是在左下,DirectX是在右上。

三、光栅化阶段

光栅化阶段主要是计算每个图元覆盖的像素和这些像素应该呈现出什么颜色。
在这里插入图片描述

1)三角形设置

  • 首先得到三角形的边界,只有这样才能得到对三角形网格的覆盖情况,进而得到像素的颜色信息。

2)三角形遍历

  • 检查三角形内的每个像素(扫描变换)
  • 获取顶点属性,插值生成片元。
  • 多重采样抗锯齿就是在这里实现的,它会对像素值进行多次采样,产生多个片元,最后在进行混合。

3)提前深度测试

  • 这个阶段不是通用流程,主要是可以在片元着色器之前丢弃不合理的值,减少运算开销。
  • 如果与透明度测试冲突,就要禁用,这也是GPU无法提前执行各种测试的原因。而且由于要判断是否有冲突,会有检测冲突的开销,有更多的片元被处理,导致了透明度测试的性能下降问题

4)片元着色器

  • 主要进行渲染方面的计算,输入和输出都是片元数据
    在这里插入图片描述
  • 根据上面的片元信息计算片元颜色,比如颜色和纹理坐标插值得到覆盖后的纹理坐标

5)逐片元操作

测试阶段,判断一个像素是否显示:

  • 裁切测试:区域判断,只在区域内的才进行绘制
  • 透明测试:透明度达到后进行绘制,否则不进行绘制
  • 模板测试:通过模板缓冲区进行像素比较(参考值和模板值),只有符合的才进行绘制
    模板测试流程
  • 深度测试:通过深度缓冲区进行深度比较(片元深度值和深度缓冲区内的值),制定深度写入规则和比较规则。
  • 透明效果和深度测试,深度写入的关系密切。unity中,深度写入不透明物体默认打开,透明物体默认关闭。测试方法默认小于等于。

混合阶段:

  • 混合:通过测试的颜色和颜色缓冲区中颜色的叠加方式
    在这里插入图片描述

  • 写入遮罩:不透明物体可以混合,也可以直接进行颜色覆盖。

6)像素缓冲区和垂直同步

在像素显示到屏幕之前,要考虑屏幕撕裂的问题,屏幕绘制的速度低于GPU提交的速度,上一帧还没有绘制完,下一帧就开始绘制了,这就会导致屏幕上同时显示两帧不同的画面,出现屏幕撕裂。在这里插入图片描述
具体可参考:

屏幕撕裂怎么解决呢?

  • 同步游戏循环,每次都到这一帧的画面结束才开始渲染,但会限制游戏循环的间隔。
  • 双缓冲技术:设置两块像素缓冲区,显示器如果完成当前帧的显示,会通过交换两个缓冲区的指针,实现两者的互换,随后显示器开始显示下一帧的画面,同时GPU也开始生成新的下一帧。而垂直同步后,GPU会等待屏幕发送一个叫做VSync的信号,接受到该信号后再进行新一帧的渲染和缓冲区更新,从而保障屏幕显示的一幅完整的画面。
  • 屏幕绘制的速度高于GPU提交的速度,同时启用了垂直同步会发生什么呢?卡顿,也就是说两帧可能显示的是同一个画面,缓冲区没有切换,屏幕显示的是上一帧画面。最后,双缓冲技术的缺点:卡顿,输入滞后,帧率下降。
  • 三缓冲技术:一个用于显示当前画面,另外两个当作后备缓冲区,其中一个后台缓冲区保持锁定为刷新率以避免撕裂,另一个由 GPU 用于继续绘制下一帧。当前缓冲区在显示器上进行显示时,其他两个缓冲区将交替渲染,交换缓冲区时,总是选择两个后备缓冲区中较新的一个。
    在这里插入图片描述
    使用三重缓冲后,可以充分利用渲染间隙,防止卡顿。对于GPU渲染较长的帧可以提前渲染。

四、坐标系

在3D渲染管线中,渲染模型到屏幕必须经历四个主要的坐标系空间:

  • 模型/局部坐标系
  • 世界坐标系
  • 视角/摄像机坐标系
  • 投影坐标系

摄像机向上的方向位置朝向就能唯一确定一个画面

世界坐标系中,矩阵变换的旋转——欧拉角和四元数之间的关系?

  • 四元数的出现是为了解决欧拉角的万向锁和插值问题
    旋转

参考

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐