渲染流水线简单梳理

目录

概述

1 应用阶段(可操控优化)

1.1 粗粒度剔除

1.2 设置渲染顺序

1.3 把数据加载到显存

1.4 设置渲染状态(SetPassCall,告诉GPU使用哪个Shader,设置Blend,Cull,ZWrite等)和DrawCall(使用哪些模型数据和贴图渲染)

2 几何阶段

2.1 顶点着色器(完全可编程)

2.2 裁剪,(GPU硬件固定操作,可通自定义裁剪操作来控制)

2.3 屏幕映射,GPU完成

2.4 补充一下

3 光栅化阶段

3.1 三角形设置

3.2三角形遍历

3.3 Early-Z技术,把深度测试提前做

4 像素处理阶段

4.1 片元着色器(完全可编程)

4.2 逐片元操作(输出合并阶段),可配置

5 结尾


概述

整体上流水线分为四个阶段:1应用阶段,2几何阶段,3光栅化阶段,4像素处理阶段

当然也可以分成三个阶段把3和4统一叫光栅化阶段。这不重要,重要是理解每个阶段的细节处理。

1 应用阶段(可操控优化)

此阶段在CPU上运行的,完全可控。

主要分为4个阶段:

1.1 粗粒度剔除

包括视锥体剔除(AABB包围盒和视锥体碰撞检测),遮挡剔除(Occlusion Culling),层级规则剔除(Culling Mask)

1.2 设置渲染顺序

根据摄像机距离和渲染队列决定顺序,队列小于2500不透,按照由近到远渲染,大于2500透明按照由远到近渲染

1.3 把数据加载到显存

根据设置好的顺序依次提交打包数据Batch,数据包括,模型信息(顶点坐标,法线,UV,顶点色,切线,索引表等),变换矩阵(世界转换矩阵,根据摄像机位置的VP矩阵,FOV参数等),灯光材质(灯光信息,材质,Shader)等。

1.4 设置渲染状态(SetPassCall,告诉GPU使用哪个Shader,设置Blend,Cull,ZWrite等)和DrawCall(使用哪些模型数据和贴图渲染)

2 几何阶段

2.1 顶点着色器(完全可编程)

主要任务是坐标变换,通过MVP矩阵把模型空间顶点坐标转换到齐次裁剪空间。当然还有其他任务,顶点着色(例如逐顶点光照颜色的计算),为光栅化阶段输出其他数据等。

转换过程如下图,其中红色框中为顶点着色器的处理过程

齐次裁剪空间要重点说明一下,

如图所示,左面是观察空间坐标系,右面是其次裁剪空间,此时顶点坐标做了齐次处理(增加了w=1分量),主要原因是,透视空间中,数值是无法正常做线性插值的,需要增加维度方便透视投影和裁剪(通过升维的方式简化裁剪过程,想到这个方法的真是天才,我怀疑他是高纬度的生物),经过裁剪矩阵(投影矩阵)转换后,w有了新的意义。可通过w判断顶点是否在视锥体内。顶点着色的输出数据为齐次裁剪空间下的坐标,主要目的就是为了后面的裁剪和屏幕映射做准备。

这个计算公式可以看到,xyz做了不同的缩放,w分量编程了Pview的-z,也就是观察空间下的z轴距离,后面再说SV_POSITION的时候还会提到。

曲面细分着色器,可选着色器,主要用于细分图元。几何着色器也是可选的,用于逐图元操作或产生更多图元,这里不是重点,暂且不谈。

2.2 裁剪,(GPU硬件固定操作,可通自定义裁剪操作来控制)

通过透视投影矩阵转换到其次裁剪空间如果该顶点在视锥体中必须满足-w<=(x,y,z)<=w,然后做透视除法(齐次除法),可以得到归一化设备坐标NDC

NDC空间下的,在dx中-1<=x,y<=1,0<=z<=1,在OpenGL中-1<=x,y,z<=1,从而判断是否是在可视范围内,完全在NDC外的剔除,部分在NDC内的,生成新的图元。

2.3 屏幕映射,GPU完成

在NDC的基础上进一步处理,把顶点坐标转换到屏幕坐标系。

此时图元坐标还是3维的,xyz范围是[-1,1],所以映射到[0,1],乘以屏幕分辨率就是屏幕坐标了

在OpenGL中屏幕的原点在左下角,DX在左上角,以GL为例转换公式为(结合了其次除法),转换屏幕坐标公式如下:

screen.x = clip.x * pixeWidth / 2*clip.w + pixeWidth/2

screen.y = clip.y * pixeHeight / 2*clip.w + pixeHeight/2

此时的z和w分量作什么呢,通常做法会把clip.z/clip.w的值储存在zbuffer里(看硬件驱动),

w分量可用在透视校正插值。

2.4 补充一下

整个几何阶段输出的核心数据SV_POSITION,也不再是齐次裁剪空间的坐标了,因为做了齐次除法和屏幕映射。这里我很少见人提到过,所以还是重点提一下吧。

pos.x =clip.x * pixeWidth / 2*clip.w + pixeWidth/2

pos.y = clip.y * pixeHeight / 2*clip.w + pixeHeight/2

pos.z = clip.z/clip.w(dx中是[0,1]gl中[-1,1])

pos.w = 1 ? 这里不对,1没有意义啊

SV_POSITION.w的值,就是经过插值后的ClipSpace的 w 值。在Unity中,这个值等价观察空间下的 z 坐标值,也就是世界空间中,到摄影机的z周距离。这个距离值可以非常方便地实现一些雾效的效果,或者用于在Cluster based Forward中计算 z 轴上的采样位置。

OpenGL中,在VertexShader下类似于 SV_POSTION 的语义为 gl_POSITION。在Fragement Shader下类似于SV_POSTION 为 gl_FragCoord。gl_FragCoord.xyz 值和 SV_POSTION.xyz 的语义是一样的。而 gl_FragCoord.w的值,等于 ClipSpace 的 w 值的倒数,这点和 SV_POSTION.w 是不同的。不过在Unity中,为我们做了自动的转换,如果我们在 PixelShader中使用 SV_POSTION.w 值的时候,在 OpenGL下,会自动转换成 1/gl_FragCoord.w,还是非常方便的。

此段为引用别人写的,原文链接

所以此在片元着色器里,可以直接用SV_POSITION语义的变量除以屏幕分辨率获得屏幕UV。

3 光栅化阶段

光栅化啥意思,简单点说就是根据三角形的三个顶点计算出覆盖的像素。

主要分为两个子阶段:三角形设置(Triangle Setup),三角形遍历(Triangle Traversal)。

3.1 三角形设置

由固定硬件完成,主要任务是计算三角形网格信息,如根据上一步得到的顶点信息,获得三角形顶点坐标和边界线用数学表达式。

3.2三角形遍历

检查每一个采样点被三角形覆盖的像素,并使用三角形的三个顶点对覆盖的像素进行插值,为覆盖的像素生成片元(fragment),片元的信息包括屏幕坐标、深度信息、顶点着色器输出的顶点信息如法线,uv等。

3.3 Early-Z技术,把深度测试提前做

正常的深度测试是在像素阶段的逐片元操作里,目的是把不需要处理的片元提前舍弃掉,提升性能,目前很多硬件都支持,以下情况会使其失效

1.开启Alpha Test,由于Alpha Test需要在像素着色器后面的Alpha Test阶段比较,所以无法在像素着色器之前就决定该像素是否被剔除,可以用Alpha Blend代替,或者双Pass优化,一个Pass做discard/clip,深度读写,一个Pass做颜色处理不做深度写入

2.关闭了深度测试,深度测试是Early-Z的前提。

3.开启了Alpha Blend 启用了Alpha混合的像素很多需要与frame buffer做混合,无法执行深度测试,也就无法利用Early-Z技术,但并不影响其他Pass使用Early-Z。

4.开启Tex Kill:即在shader代码中有像素摒弃指令(DX的discard,OpenGL的clip),1中的AlphaTest也是使用了clip函数。

4 像素处理阶段

4.1 片元着色器(完全可编程)

输入的从顶点信息插值的结果,通过对这些信息的处理,为这个片元计算颜色,常用的技术是纹理采样,通过顶点插值来的uv,采样纹理的颜色。

4.2 逐片元操作(输出合并阶段),可配置

主要任务

1.通过一些列测试决定们每个片元的可见性

如:透明度测试->模板测试->深度测试

2.把通过测试的片元的颜色和颜色缓冲区的颜色进行混合,混合后写入缓冲区。

和颜色缓冲区一样,还有模板缓冲区(当前模板之和缓冲区值比较决定片元是否舍弃和写入),深度缓冲区(和模板缓冲区类似),系统中所有的缓冲区组成了帧缓冲区(frame buffer)

至此屏幕就显示了帧缓冲区里的颜色了,为了使画面连续,使用双重缓冲技术。

4.3 拿到帧缓冲之后其实还有一个很重要的操作,就是做屏幕后处理,例如Bloom,DOF等

5 结尾

本文大量篇幅在几何阶段,这个阶段相对难理解的,也是最为重要的,他们整个流水线做了基础的准备工作,有了这些准备后面的流程才能方便的计算,后续还有其他细节想起来再补充吧。

相关新闻

OpenStack Cinder备份助手cinderback:从快照到恢复的生产级实践

OpenStack Cinder备份助手cinderback:从快照到恢复的生产级实践

简介&#xff1a;面向OpenStack云平台运维与二次开发人员&#xff0c;这份Python脚本资源以Cinder Backup Service为操作对象&#xff0c;旨在简化卷备份与还原流程&#xff0c;并针对官方服务在跨租户管理、在用卷备份等方面的限制给出可落地的变通方案。脚本支持按租户或全部…

2026/10/20 1:15:49 阅读更多 →
Linux Qt 连接达梦数据库:从环境配置到实战代码

Linux Qt 连接达梦数据库:从环境配置到实战代码

1. 引言达梦数据库&#xff08;DM&#xff09;是国产主流关系型数据库之一&#xff0c;在政务、金融、能源等行业应用广泛。Qt 作为跨平台 C 应用框架&#xff0c;常被用于开发桌面端和嵌入式端业务系统。本文围绕 Linux 环境下 Qt 连接达梦数据库的完整流程展开&#xff0c;涵…

2026/10/20 1:14:48 阅读更多 →
Bambu Studio 快速上手指南:免费开源 3D 打印切片,从模型到 GCode 一键完成

Bambu Studio 快速上手指南:免费开源 3D 打印切片,从模型到 GCode 一键完成

Bambu Studio 快速上手指南&#xff1a;免费开源 3D 打印切片&#xff0c;从模型到 GCode 一键完成 【免费下载链接】BambuStudio PC Software for BambuLab and other 3D printers 项目地址: https://gitcode.com/GitHub_Trending/ba/BambuStudio Bambu Studio 是一款免…

2026/10/20 1:14:48 阅读更多 →

最新新闻

技术人技能管理指南:从技能盘点、刻意练习到作品集构建

技术人技能管理指南:从技能盘点、刻意练习到作品集构建

1. 从“skills”这个词说起&#xff1a;为什么它突然成了硬通货“skills”这个词&#xff0c;放在五年前&#xff0c;可能只是简历底部一个不起眼的栏目。但现在你打开任何一个技术社区、招聘页面或者同行群聊&#xff0c;它出现的频率高得离谱。我自己的感受是&#xff0c;过去…

2026/10/20 4:25:39 阅读更多 →
从skills到能力体系:一线从业者的技能拆解与提升指南

从skills到能力体系:一线从业者的技能拆解与提升指南

1. 从“skills”这个词说起&#xff1a;为什么它突然成了高频热词最近一段时间&#xff0c;“skills”这个词在各类技术社区和职场讨论中出现的频率明显高了起来。不管是招聘信息里的“核心skills要求”&#xff0c;还是各种项目复盘里提到的“这个项目真正锻炼到的是什么skill…

2026/10/20 4:25:39 阅读更多 →
Skills能力模型拆解:从硬软技能到可迁移的T型与π型组合

Skills能力模型拆解:从硬软技能到可迁移的T型与π型组合

1. 从“skills”这个词说起&#xff1a;为什么它突然成了高频词“skills”这个词最近在各种场合被反复提起&#xff0c;不是没有原因的。我在几个技术社区和职场社群里潜水观察了大半年&#xff0c;发现一个很明显的趋势&#xff1a;大家讨论的不再是“你会用什么工具”&#x…

2026/10/20 4:25:39 阅读更多 →
AI大模型辅助基金申报:立项依据到创新点的全流程实操

AI大模型辅助基金申报:立项依据到创新点的全流程实操

每到申报季&#xff0c;我身边的同行们就开始进入一种“又忙又累又焦虑”的状态。2026年的国自然和省级基金申报&#xff0c;有一个信号特别明显&#xff1a;“瘦身提质”。说白了&#xff0c;就是申报书不能再靠堆字数、堆材料来撑场面了&#xff0c;要在有限的篇幅内把科学问…

2026/10/20 4:25:39 阅读更多 →
插件化知识工作流:用可插拔架构重构个人效率系统

插件化知识工作流:用可插拔架构重构个人效率系统

1. 从“知识工作插件”这个命名说起&#xff1a;它到底在解决什么问题第一次看到“knowledge-work-plugins”这个命名&#xff0c;我的直觉是&#xff1a;这不是一个具体的工具&#xff0c;而是一类架构思路的统称。它指向的是把知识工作者的日常操作——写文档、整理资料、做决…

2026/10/20 4:25:39 阅读更多 →
负面结果也值得公开:gemma-4-12b-constraintkit的SFT数据工厂与被放弃的图像转CAD实验

负面结果也值得公开:gemma-4-12b-constraintkit的SFT数据工厂与被放弃的图像转CAD实验

【免费下载链接】gemma-4-12b-constraintkit-GGUF 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/jajmangold/gemma-4-12b-constraintkit-GGUF 点击查看 免费下载 gemma-4-12b-constraintkit 是一个基于 Gemma 4 12B 微调的 text-to-CAD&#xff08;文本生成 CAD&a…

2026/10/20 4:24:39 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →