图形1.1 渲染流水线

渲染流水线

 


 

渲染阶段

 

  • 应用阶段(Application Stage):应用阶段由cpu负责。决定传递给gpu的数据

  • 几何阶段(Geometry Stage): 上个阶段传递过来的图元进行逐顶点、逐多边形的操作。把顶点坐标转换到屏幕空间,并决定传给光栅器处理的数据

  • 光栅化阶段(Rasterizer Stage):光栅化阶段由gpu负责。决定哪些像素应该被绘制在屏幕上并计算对应像素的颜色。

 


 

CPU与GPU的通信

 

cpu在与gpu的通信中,需要把数据加载到显存,设置好渲染状态,然后调用DrawCall。

加载数据:这些数据包括网格纹理、顶点颜色法线纹理等。

渲染状态:决定使用哪个着色器、光源属性、材质来渲染,所有的网格使用一种渲染状态。

DrawCall:一个发起绘制命令的函数,由cpu发出。它指向一个即将被渲染的图元列表,通知gpu按照设置进行图元渲染。

——不要频繁的调用DrawCall。在实际的渲染中,GPU的渲染速度往往超过了CPU提交命令的速度,这导致渲染中大部分时间都消耗在了CPU提交Draw Call上。我们需要尽可能用多准备数据给cpu而更少的调用DrawCall,从而通知gpu快速渲染。

 


 

渲染流水线概述

 

  • 应用阶段
    • 粗粒度剔除
    • 进行渲染设置
    • 准备基本数据
    • 输出到几何阶段
  • 几何阶段
    • 顶点着色器
    • 曲面细分
    • 几何着色器
    • 顶点裁剪
    • 屏幕映射
  • 光栅化阶段
    • 三角形(点/线)设置
    • 三角形(点/线)遍历
    • 片元着色器
  • 逐片元操作
    • 裁剪测试
    • 透明度测试
    • 深度测试
    • 模板测试
    • 混合

 


 

应用阶段

 

  • 准备基本场景数据
    • 场景物体数据:物体变换数据、物体网格数据
    • 摄像机数据:位置方向远近裁剪平面、正交/透视、视口比例/尺寸等
    • 光源及阴影数据:光源类型、位置角度方向等参数
    • 其他全局数据
  • 加速算法 粗粒度剔除
    • 碰撞检测
    • 加速算法
    • 遮挡剔除:八叉树、BSP树、K-D树、BVH
    • 其他算法
  • 设置渲染状态 准备渲染参数
    • 绘制设置:使用着色器、合批方式
    • 绘制顺序:相对相机距离、材质渲染队列、UICanvas、其他方式
    • 渲染目标:FrameBuffer、RenderTexture
    • 渲染模式:前向渲染、延迟渲染
  • 调用DrawCall 输出渲染图元到显存
    • 顶点数据:位置、颜色、纹理、发现、纹理uv坐标、其他
    • 其他数据:MVP变换矩阵、纹理贴图、其他

 


几何阶段

 

  • 顶点数据 [可以完全编程控制]
    • 视图变换
    • 顶点着色:坐标空间转换、顶点变换、逐顶点色彩信息处理
  • 可选顶点处理 [可以完全编程控制]
    • 曲面细分(可选):在原有的图元内加入更多的顶点
    • 几何着色器(可选):可控制GPU对顶点进行增删改操作,并行程度低
  • 投影 [无法控制 已由GPU固定实现]
    • 正交
    • 透视
  • 裁剪 [无法完全控制]
    • CVV:(Canonical View Volume)
    • 正面或背面剔除(可配置)
  • 屏幕映射 [无法控制 已由GPU固定实现]
    • 从连续到离散
    • 坐标系差异

 


 

光栅化阶段

 

  • 三角形设置:图元装配,把顶点数据收集并组装为简单的基本体
  • 三角形遍历:检验屏幕上的某个像素是否被一个三角形网格覆盖,被覆盖的区域将生成一个片元。这些片元用于计算每个像素的最终颜色,并对其深度进行插值计算,对于后面计算遮挡、半透明等效果有着重要作用。
  • 片元着色器:为每个片元计算颜色,该阶段完全可编程,计算结果不与附近片元相影响。

 


 

逐片元操作

 

  • 裁剪测试:剔除所有裁剪框外的片元
  • 透明度测试:仅绘制透明度值达到设置的阈值时的片元。在OpenGL3.1被删除,与clip()效果相差不大
  • 模板测试:将目标片元的模板值与缓冲区片元的模板值进行可配置的比较,仅绘制通过比较的片元
  • 深度测试:将目标片元的深度值与缓冲区片元的深度值进行可配置的比较,仅绘制通过比较的片元。[大量的被遮挡片元浪费了计算量,在不与透明度测试冲突的情况可用Early-Z(早于片元着色器计算前进行舍弃)进行优化]
  • 混合:通过可配置的规则进行颜色的替换或者根据不透明度混合

 


 后处理

 

对输出的缓冲区/渲染贴图进行处理,如:Bloom,景深,FXAA,边缘检测。  

 


 

参考

 

  1. GAMES101-现代计算机图形学入门-闫令琪-Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)
  2. 【技术美术百人计划】图形 1.1 渲染流水线-TA100-renderpipeline-v2.1

 

跳转回百人合集

 

posted @ 2021-12-31 00:43  anesu  阅读(244)  评论(0编辑  收藏  举报