【技术美术】GPU渲染管线笔记
【技术美术】GPU 渲染管线笔记
基本术语
基元、图面:
网格中所使用的顶点数据布局,常见的如点、线、三角面等,特殊的甚至包括一些带邻近基元的基元类型。
参数语义
语义是附加到着色器输入或输出参数的字符串,用于传达给系统有关参数的预期用途的信息。
用户语义
由用户在 IA 阶段定义的语义。用于描述传入的数据类型,以便系统在 VS 阶段分配输入参数;同时也用于在其他着色器中标记要在各阶段传递的数据,虽然此时数据类型已无作用,但语法上还是需要的。
系统语义
系统语义则是系统自带的语义,这些语义为了满足一些功能而存在,如向系统表明着色器输出参数,请求系统自动设置一些特殊值等,其都使用SV_
作为前缀。
数据类型
在各着色器间都存在输入输出参数,其中一些参数由系统语义明确定义,此外还可以由用户语义自定义一些额外参数。这些数据间通常还存在着共用的传递关系,根据使用情况可以分为以下几类。
装配数据
顶点着色器的输入数据,大多由用户语义定义,是来自 IA 阶段的原始网格数据。
- SV_VertexID:当前顶点在原始网格数据中的排序序号。
- SV_InstanceID:当使用实例化渲染功能时额外传递的实例序号。
顶点数据
经过顶点着色器处理后的,系统所用的顶点数据,多个着色器阶段都会用到该数据。
- SV_Position:基元光栅化时所用的最终顶点位置。
外壳数据
在分割阶段中使用的数据,由外壳着色器创建。
- SV_TessFactor:基元的边缘分割次数。
- SV_InsideTessFactor:基元的内部分割次数。
备注
- 如果外壳着色器阶段将任何边缘细化因子设置为 = 0 或 NaN,则将剔除补丁,从而不生成可见输出。
渲染流程
https://learn.microsoft.com/zh-cn/windows/win32/direct3d11/overviews-direct3d-11-graphics-pipeline
1. 输入装配器阶段(IA)
从用户填充的缓冲区中读取基元数据 (点、线和/或三角形) ,并将数据组装成将由其他管道阶段使用的基元。
- 创建输入缓冲区。
- 创建输入布局对象。
- 将对象绑定到输入。
- 指定基元类型。
- 调用绘制方法。
2. 顶点着色器阶段(VS)
处理输入装配器提供的顶点,执行每个顶点运算,例如空间变换、外观变形和每顶点照明。
- 输入:装配数据
- 输出:顶点数据
3. 分割阶段
通过在硬件中实施分割,使图形管道可解算更低画质(多边形数量更少)模型但并以更高画质进行渲染。
域:
用于分隔的多边形。
补丁:
域被分割后产生的新多边形。
控制点:
本质是一个顶点,其决定了域的形状,如三角形域就是有三个控制点。在分割补丁时会将其作为补丁顶点的参考点,通过权重混合多个控制点来得出。
修补程序:
负责将原始域分割为补丁的程序。
3.1. 外壳着色器阶段(HS)
该阶段由两个函数构成。
外壳着色器
计算构成补丁的控制点的顶点数据。
- 输入:原始基元控制点的顶点数据、SV_PrimitiveID、SV_OutputControlPointID
- 输出:补丁的其中一个控制点的顶点数据
修补程序常量函数
为细分器阶段和域着色器阶段提供计算参数。
- 输入:原始基元控制点的顶点数据、SV_PrimitiveID
- 输出:外壳数据
3.2. 细分器阶段(Tessellator)
这是一个固定函数阶段,利用从外壳着色器阶段传入的细化因素和分区类型,将域(四边形、三角形或线)分割为很多较小对象(三角形、点或线)。
3.3. 域着色器阶段(DS)
计算补丁程序生成的新基元的顶点数据。
- 输入:外壳数据、补丁控制点的顶点数据、SV_DomainLocation
- 输出:补丁的其中一个顶点的顶点数据
4. 几何着色器阶段(GS)
将顶点作为输入,并能够在输出中生成新顶点,从而实时创造新的网格。
- 输入:原始的顶点数据序列
- 输出:新增的顶点数据序列
5. 光栅化阶段(RS)
将网格基元映射为屏幕上的“像素”(实际是由 2x2 像素区域构成的片元),并计算对应的顶点数据插值,以便为像素着色器提供输入数据。
6. 像素着色器阶段(PS)
对像素实现丰富的着色技术,例如每像素照明和后期处理。
- 输入:顶点数据
- 输出:SV_Target、SV_Depth
7. 输出合并阶段(OM)
将像素着色器生成的像素数据按原始三角形的顺序进行进一步处理。
裁剪测试:
剔除指定区域(通常是视口)之外的像素。
alpha 测试:
剔除透明度低于指定值的像素。(Direct3D 10 及以上版本不支持,但可通过
clip()
实现等效操作)模板测试
深度测试
深度测试分为早期和晚期两种:在晚期执行是传统方案,也即目前的流程;早期则是提前到像素着色器之前,从而免去晚期中的很多无效运算。现代 GPU 大多支持早期深度测试,前提是没有在像素着色器中写入深度或使用 AlphaTest、Blend 等功能,否则会退化为晚期测试。
Unity 中深度测试默认是早期,根据官方的渲染流程图中可以看出。
混合
参考资料
【技术美术】GPU渲染管线笔记的更多相关文章
- GPU渲染管线概述
1.顶点着色器 顶点着色器是流水线的第一个阶段,它的输入来自于CPU.顶点着色器的处理单位是顶点,也就是说输入进来的每个顶点都会调用一次顶点着色器. 顶点着色器需要完成的工作主要有:坐标变换和逐顶点光 ...
- SQLServer 2008 技术内幕——T-SQL 查询 笔记
原文:SQLServer 2008 技术内幕--T-SQL 查询 笔记 1.SQL编程有许多独特之处,如:面向集合的思维方式.查询元素的逻辑处理顺序.三值逻辑.如果不掌握这些知识就开始用SQL编程,得 ...
- Java 横向技术 Spring框架【笔记】
Java横向技术 spring框架[笔记] Spring 的两大特性是什么? AOP(Aspect Oriented Programming,面向切面编程)与 IOC(Inverse of Contr ...
- Java基础技术JVM面试【笔记】
Java基础技术JVM面试[笔记] JVM JVM 对 java 类的使用总体上可以分为两部分:一是把静态的 class 文件加载到 JVM 内存,二是在 JVM 内存中进行 Java 类的生命周期管 ...
- java基础技术集合面试【笔记】
java基础技术集合面试[笔记] Hashmap: 基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(除了不同步和允许使用 null 之外,Ha ...
- Java基础技术基础面试【笔记】
Java基础技术基础面试[笔记] String.StringBuilder以及StringBuffer三者之间的区别? 三者的区别可以从可变性,线程安全性,性能这三个部分进行说明 可变性 从可变性来说 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
- 我要吹爆这份阿里中间件技术内部的RM笔记,简直佩服到五体投地
消息队列 RocketMQ 版是阿里云基于 Apache RocketMQ 构建的低延迟.高并发.高可用.高可靠的分布式消息中间件.该产品最初由阿里巴巴自研并捐赠给 Apache 基金会,服务于阿里集 ...
- 2MyBatis入门--深入浅出MyBatis技术原理与实践(笔记)
什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
- PHP+MySQL开发技术详解—学习笔记
1. PHP is Hypertext Preproocessor. 2. Hello World: <?php Echo ‘Hello World!’; ?> 3. ...
随机推荐
- RAG分块策略:主流方法(递归、jina-seg)+前沿推荐(Meta-chunking、Late chunking、SLM-SFT)
RAG分块策略:主流方法(递归.jina-seg)+前沿推荐(Meta-chunking.Late chunking.SLM-SFT) 大多数常用的数据分块方法(chunking)都是基于规则的,采用 ...
- Taro微信小程序获取Tab页可视区域高度
前情 公司有自己的小程序项目,因公司主要技术栈为react,所以选择了Taro来开发,Taro是京东出品的多端统一开发解决方案,用来开发小程序也相比用原生开发,在开发体验上好很多,而且还能使用成熟的R ...
- 用 Ingram 和 masscan 来扫描全网存在漏洞的camera
前言 大学的时候也写过和Ingram差不多的工具,不过那时候已经玩到没有兴致了,代码已不知道哪里去.没想到在Github看到了这个工具,实现思路和我的几乎一样,互联网就是这么神奇. Ingram的Gi ...
- JVM实战—8.如何分析jstat统计来定位GC
大纲 1.使用jstat了解线上系统的JVM运行状况 2.使用jmap和jhat了解线上系统的对象分布 3.如何分析JVM运行状况并合理优化 4.使用jstat分析模拟的BI系统JVM运行情况 5.使 ...
- 解决Playwright访问https证书问题
# 参数说明 ignore_https_errors=True 访问https地址解决安全证书 viewport={"width": 1920, "height" ...
- 解读ENS网络连接,面向多云多池网络的高效互联
本文分享自华为云社区<ENS网络连接,面向多云多池网络的高效互联>,作者:华为云Stack ENS研发团队. 1.ENS网络连接服务场景详细介绍 ENS网络连接通过统一建模和全局管控实现跨 ...
- 【译】在分析器中使用 Meter Histogram(直方图)解锁见解
您是否正在与应用程序中的性能瓶颈作斗争?不要再观望了!Visual Studio 2022 在其性能分析套件中引入了 Meter Histogram(直方图)功能,为您提供了前所未有的分析和可视化直方 ...
- Solution Set -「LOCAL」冲刺省选 Round I
\(\mathscr{Summary}\) 状态还行叭. A 题又犯坏习惯,走起来就大力分讨,上了个厕所之后冷静一下开始寻找比较普适性的 DP 状态,然后几乎就切掉了,可惜复杂度写假了没发现( ...
- CDS标准视图:维护通知数据 I_PMNotifMaintenanceData
视图名称:维护通知数据 I_PMNotifMaintenanceData 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Notification Mainte ...
- jwt-shiro-springsecurity-oauth2对比
1 实现token的方式概述 在cookie\session\token辨析一文已经知道了token这个概念,里面简单说明了token的组成就是数据+签名,给出了token实现身份验证的流程,并且详细 ...