C++学习(一七四)Qt的渲染器Render

默认渲染器着重于两种优化渲染的主要策略:批处理调用,以及在GPU上保留几何图形。

1、批处理

在编写传统的2D API(例如QPainter,Cairo或Context2D)以处理每帧数千个单独的绘制调用的情况下,OpenGL是纯硬件API,当绘制调用的次数非常少且状态更改保持为低时,其性能最佳。最低。考虑以下用例:

绘制此列表的最简单方法是逐个单元地进行。首先,绘制背景。这是特定颜色的矩形。在OpenGL术语中,这意味着选择着色器程序进行纯色填充,设置填充颜色,设置包含x和y偏移量的转换矩阵,然后使用例如glDrawArrays绘制组成矩形的两个三角形。接下来绘制图标。用OpenGL术语来说,这意味着选择一个着色器程序来绘制纹理,选择要使用的活动纹理,设置转换矩阵,启用alpha混合,然后使用例如glDrawArrays绘制组成图标边界矩形的两个三角形。单元格之间的文本和分隔线遵循类似的模式。并且对于列表中的每个单元重复此过程,因此对于更长的列表,OpenGL状态更改和绘制调用所带来的开销完全超过了使用硬件加速API所能提供的好处。

当每个基元很大时,此开销可以忽略不计,但是在典型的UI情况下,有许多小项加起来会产生相当大的开销。

默认的场景图渲染器在这些限制内工作,并且将尝试将单个图元合并到批中,同时保留完全相同的视觉结果。结果是更少的OpenGL状态更改和最少的绘制调用次数,从而实现了最佳性能。

1.1不透明图元

渲染器在不透明的图元和需要alpha混合的图元之间进行分隔。通过使用OpenGL的Z缓冲区并为每个图元赋予唯一的z位置,渲染器可以自由地对不透明图元进行重新排序,而无需考虑它们在屏幕上的位置以及与它们重叠的其他元素。通过查看每个图元的材质状态,渲染器将创建不透明的批处理。在Qt Quick核心项目集中,这包括具有不透明颜色和完全不透明图像的矩形项目,例如JPEG或BMP。

使用不透明图元的另一个好处是,不透明基元不需要启用GL_BLEND,这可能会非常昂贵,尤其是在移动和嵌入式GPU上。

不透明的图元在启用glDepthMask和GL_DEPTH_TEST的情况下以从前到后的方式呈现。在内部进行Early-z检查的GPU上,这意味着片段着色器不需要针对被遮盖的像素或像素块运行。请注意,渲染器仍需要考虑这些节点,并且顶点着色器仍将为这些基元中的每个顶点运行,因此,如果应用程序知道某些东西完全被遮盖,则最好的办法是使用Item显式隐藏它Item :: visible或Item :: opacity。

注意:Item :: z用于控制项目相对于其同级物品的堆叠顺序。它与渲染器和OpenGL的Z缓冲区没有直接关系。

1.2透明混合基元

一旦绘制了不透明的图元,渲染器将禁用glDepthMask,启用GL_BLEND并以从后到前的方式渲染所有透明混合图元。

透明图元的批处理在渲染器中需要更多的工作,因为重叠的元素需要以正确的顺序进行渲染,以使透明混合看起来正确。仅仅依靠Z缓冲区是不够的。渲染器在所有透明图元上进行传递,除了其材质状态外,还将查看其边界rect,以确定哪些元素可以批处理,哪些元素不能批处理。

在最左侧的情况下,可以在一个调用中绘制蓝色背景,而在另一个调用中绘制两个文本元素,因为文本仅与它们堆叠在其前面的背景重叠。在最右边的情况下,“Item4”的背景与“Item3”的文本重叠,因此在这种情况下,需要使用单独的调用来绘制背景和文本中的每一个。

在Z方向上,透明图元与不透明图元交错,并且在可用时可能会触发Early-z,但同样,将Item :: visible设置为false总是更快。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值