RHI学习笔记(2)-Qt6的RHI结构

从前文的分析可以看出,RHI的主要作用就是抹平不同图形API的差异,作为一个抽象层,提供一个统一跨平台的图形渲染接口,同时可以充分利用底层图形API的优势。它抹平平台差异,让开发者可以专注于实现渲染效果,而不用去适配底层平台,而RHI负责底层平台的兼容性。

如图所示,为QRhi系统的基本结构,其核心类为QRhi,在渲染线程QSGRenderThread中通过QSGRhiSupport调用QRhi的create函数进行创建,其中QSGRhiSupport用于获得系统中使用的图形API的类型,可以通过"QSG_INFO"环境变量进行配置,若环境变量为空,则进一步根据平台判断使用的默认API,比如Windows默认使用DirectX等。

QRhi持有QRhiImplementation,在它的create函数中,根据传入的backend类型来创建不同的QRhiImplementation,QRhiImplementation是一个基类,也就是统一了图形API的基础功能,比如创建一个贴图和创建一个采样器等等,QRhi依赖于QRhiResource及其子类,因为其中封装了QRhiImplementation,可以通过对应图形API的创建贴图接口,创建出对应平台的贴图对象,它包含一个QThread对象,用于保存当前线程,它通过QRhiImplementation的implThread变量保存在QRhi中,同时保留着QRhiDriverInfo和QRhiProfiler对象的指针。QRhiProfiler保存当前的Rhi实现的rhiDWhenEnabled,QRhiDriverInfo保留这对应设备的Rhi信息,包括deviceId和vendorId等。

可以看出五个QRhiImplementation的子类各自有各自的个性接口,也有统一的功能,比如完成一次渲染的pass相关的beginPass和endPass等,处理绘制每一帧的beginFrame和endFrame等,处理计算pass的beginComputePass和endComputePass,如果想学习某一个特殊的图形API,可以以其中的一个类为源码来学习,而Rhi的任务恰恰是把不同图形API的所有概念都统一起来,由外部开发者处理调用,使用QRhi,你只需要了解一套概念即可。

随着现代底层图形API的兴起,仅仅完成渲染任务已经不足以满足开发者对于Rhi的要求,Rhi需要更多的考虑控制底层,如显存管理和命令缓冲等,现代底层API最重要的特性就是可以控制底层GPU显存的分配,处理资源分配和设置渲染屏障,这时候Rhi由一个抽象封装层变为更多的资源管理器的角色,因此QRhi的设计也考虑了这一点,除了QRhiImplementation这个核心类,QRhi的结构中还有一个重要角色就是QRhiResource。

这里以贴图类QRhiTexture为例,介绍资源管理的基本结构,作为QRhiImplementation的持有者,QRhi负责获得对应图形API的QRhiImplementation,比如Windows上DirectX类,通过QRhi的newTexture调用QRhiImplementation的createTexture,在QRhiD3D11的createTexture中,创建DirectX对应的QRhiD3D11Texture,QRhiD3D11Texture中隐藏了DirectX的贴图的具体细节。

QRhiResource掌管了渲染中的多个概念,见表2-1

|------------------------|-------------------------------------------------------|
| 名称 | 功能 |
| Texture | 贴图,渲染中的基础概念,即渲染在屏幕上的图片信息 |
| Sampler | 采样器对象定义了采集纹理时所用的过滤器和寻址模式 |
| RenderBuffer | 绘图操作和内存传输等在命令缓冲区对象中记录要执行的所有操作,可以支持该命令在子线程中完成 |
| RenderPassDescriptor | 描述了渲染通道(Render Pass)的全部配置,包括附件格式、子通道(Subpass)布局、依赖关系等 |
| RenderTarget | 指定颜色、深度、模板缓冲区等输出目标 |
| TextureRenderTarget | 纹理信息输出目标 |
| ShaderResourceBindings | 将着色器程序与GPU资源,比如缓冲区、纹理、采样器等建立绑定的信息 |
| GraphicsPipeline | 图形渲染管线信息 |
| SwapChain | 图形API中连接GPU渲染输出与显示设备的信息,负责管理一组后台缓冲区与前台缓冲区 |
| ComputePipeline | 计算管线信息 |
| CommandBuffer | 渲染命令缓冲区 |
| Buffer | 缓冲区信息(如顶点缓存信息等) |

随着图形API更贴近底层,更加直接的操纵底层数据等特性,Rhi的设计将更偏重于资源管理,因此QRhiResource包含了现代图形API的大部分特性,因此它也是我们学习现代图形API的很好的参考教程,后续将通过QRhiResource子类的管理和调用方式的分析,更加深入的了解Qt6的Rhi系统。

相关推荐
Non importa2 小时前
二分法:算法新手第三道坎
c语言·c++·笔记·qt·学习·算法·leetcode
山岚的运维笔记2 小时前
SQL Server笔记 -- 第74章:权限或许可 第75章:SQLCMD 第76章:资源调控器
数据库·笔记·sql·microsoft·oracle·sqlserver
舟舟亢亢2 小时前
Redis知识复习笔记(上)
数据库·redis·笔记
winfreedoms12 小时前
ROS2语音&ai与控制——黑马程序员ROS2课程上课笔记(6)
人工智能·笔记
执于代码12 小时前
IEDA工具总结笔记
笔记
山岚的运维笔记14 小时前
SQL Server笔记 -- 第72章:隔离级别与锁定
数据库·笔记·后端·sql·microsoft·sqlserver
じ☆冷颜〃15 小时前
从确定性算子到随机生成元:谱范式的演进
经验分享·笔记·线性代数·矩阵·抽象代数
日更嵌入式的打工仔15 小时前
RTOS上下文保存
笔记
weixin_4481199417 小时前
Datawhale 硅基生物进化论 202602第3次笔记
笔记