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系统。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值