图形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,边缘检测。
参考
- GAMES101-现代计算机图形学入门-闫令琪-Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)
- 【技术美术百人计划】图形 1.1 渲染流水线-TA100-renderpipeline-v2.1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具