QRhiCommandBuffer 类

命令缓冲区资源。 更多...

头文件 #include <QRhiCommandBuffer>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui
Qt 6.6
继承 QRhiResource

公共类型

枚举BeginPassFlag { ExternalContent, DoNotTrackResourcesForCompute }
标志BeginPassFlags
DynamicOffset
枚举IndexFormat { IndexUInt16, IndexUInt32 }
VertexInput

公共函数

voidbeginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
voidbeginExternal()
voidbeginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
voiddebugMarkBegin(const QByteArray &name)
voiddebugMarkEnd()
voiddebugMarkMsg(const QByteArray &msg)
voiddispatch(int x, int y, int z)
voiddraw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)
voiddrawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0)
voidendComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
voidendExternal()
voidendPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
doublelastCompletedGpuTime()
const QRhiNativeHandles *nativeHandles()
voidresourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)
voidsetBlendConstants(const QColor &c)
voidsetComputePipeline(QRhiComputePipeline *ps)
voidsetGraphicsPipeline(QRhiGraphicsPipeline *ps)
voidsetScissor(const QRhiScissor &scissor)
voidsetShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)
voidsetStencilRef(quint32 refValue)
voidsetVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)
voidsetViewport(const QRhiViewport &视口)

重新实现的公共函数

virtual QRhiResource::TyperesourceType() const override

详细描述

目前应用程序无法创建。只能通过以下方式获取有效QRhiCommandBuffer:从目标swapchain通过 QRhiSwapChain::currentFrameCommandBuffer() 获取,或者在完全离屏渲染的情况下,通过 QRhi::beginOffscreenFrame() 初始化。

注意:这是一个带有有限兼容性保证的RHI API,有关详细信息,请参阅 QRhi

成员类型文档

枚举 QRhiCommandBuffer::BeginPassFlag
标志 QRhiCommandBuffer::BeginPassFlags

QRhi::beginPass()的标记值

常量描述
QRhiCommandBuffer::ExternalContent0x01指定在此过程中将调用 QRhiCommandBuffer::beginExternal()。某些后端(特别是Vulkan)如果没有设置此标记而仍调用 beginExternal(),则将失败。
QRhiCommandBuffer::DoNotTrackResourcesForCompute0x02指定在无需跟踪此过程中使用的资源的情况下,无需跟踪资源。如果没有此类跟踪,则意味着该帧中没有计算传递。这是一个优化提示,某些后端可以将其考虑在内,尤其是OpenGL,允许它们跳过某些操作。当在帧中的渲染传递中设置此标记时,调用该帧中的 beginComputePass() 可能会导致意外的行为,具体取决于渲染传递和计算传递之间的资源依赖关系。

BeginPassFlags类型是 QFlags<BeginPassFlag> 的同义词。它存储BeginPassFlag值的组合。

[alias] QRhiCommandBuffer::DynamicOffset

QPair<int, quint32> 的同义词。第一个条目是绑定,第二个条目是在缓冲区中的偏移量。

枚举 QRhiCommandBuffer::IndexFormat

指定索引数据类型

常量描述
QRhiCommandBuffer::IndexUInt160无符号16位(quint16)
QRhiCommandBuffer::IndexUInt321无符号32位(quint32)

[alias] QRhiCommandBuffer::VertexInput

QPair<QRhiBuffer *, quint32> 的同义词。第二个条目是在第一个指定的缓冲区中的偏移量。

成员函数文档

void QRhiCommandBuffer::beginComputePass(QRhiResourceUpdateBatch *资源更新 = nullptr, QRhiCommandBuffer::BeginPassFlags 标志 = {})

记录开始新的计算传递。

资源更新,当不为空时,指定要提交并释放的资源更新批次。

注意:不要假设在传递之间有任何状态或资源绑定保持不变。

注意:计算传递可以记录 setComputePipelinesetShaderResourcesdispatch 调用,而不是图形调用。在渲染和计算传递中都可用一般功能,例如,调试标记和 beginExternal

注意: 只有当Compute功能被报告为支持时,才可用Compute。

flags当前未使用。

void QRhiCommandBuffer::beginExternal()

适用于在应用程序通过调用图形API函数直接向当前传递的命令缓冲区队列命令之前。

注意: 这在提前在beginPass()或beginComputePass()中声明了意图时才可用。因此,此函数仅在指定了QRhiCommandBuffer::ExternalContent的情况下记录传递开始时调用。

使用Vulkan、Metal或Direct3D 12,可以通过nativeHandles()查询本机命令缓冲区或编码器对象,并将命令排队。使用OpenGL或Direct3D 11,可以从QRhi::nativeHandles()检索(设备)上下文。然而,此操作绝不能在不保证QRhiCommandBuffer的状态保持最新时进行。因此,需要在beginExternal()和endExternal()之间包装任何外部添加的命令记录。在概念上,这与QPainterbeginNativePainting()和endNativePainting()函数相同。

特别是对于OpenGL,此函数有一个附加任务:确保上下文在当前线程上当前有效。

注意: 调用beginExternal()后,在调用endExternal()之前,不得在QRhiCommandBuffer上调用其他特定于渲染传递的函数(如set*draw*)。

警告: 一些后端可能会在beginExternal() - endExternal()块内部从QRhiCommandBuffer::nativeHandles()返回与主不同的本机命令缓冲区对象。因此,在调用beginExternal()之后需要重新查询本机命令缓冲区对象。在实际情况中,这意味着对于Vulkan,外部记录的 Vulkan 命令将被放置在辅助命令缓冲区(具有VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)上。nativeHandles()在begin/endExternal之间被调用时返回此辅助命令缓冲区。

另请参阅 endExternal()和nativeHandles()。

void QRhiCommandBuffer::beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})

记录一个新的渲染传递,目标为rt渲染目标。

资源更新,当不为空时,指定要提交并释放的资源更新批次。

渲染目标的颜色和深度/模板缓冲通常会被清除。清除值在colorClearValuedepthStencilClearValue中指定。例外情况是当渲染目标创建于具有QRhiTextureRenderTarget::PreserveColorContents和/或QRhiTextureRenderTarget::PreserveDepthStencilContents的情况下。此时,清除值将被忽略。

注意: 启用保留颜色的或深度内容会导致性能降低,具体取决于底层硬件。具有分块架构的移动GPU无需将先前内容重新加载到分块缓冲区中。类似地,以QRhiTextureRenderTarget的形式使用作为深度缓冲区的QRhiTexture比使用QRhiRenderBuffer效率更低,因为使用深度纹理需要将数据写入其中,而渲染缓冲区则无需这么做(因为API不允许从渲染缓冲区采样或读取)。

注意:不要假设在传递之间有任何状态或资源绑定保持不变。

注意: QRhiCommandBuffer中,setdraw函数只能在通道内部调用。除了setGraphicsPipeline()之外,它们期望在命令缓冲区上已经设置了管道。否则,可能会出现未指定的问题,具体取决于后端。

如果rtQRhiTextureRenderTarget,beginPass()将检查从渲染目标引用的纹理和渲染缓冲区对象是否更新。这类似于setShaderResources()为QRhiShaderResourceBindings所做。如果有任何附件自QRhiTextureRenderTarget::create()以来已被重建,则显式在rt上调用create()。因此,如果rt有一个QRhiTexture颜色附件texture,并且需要调整纹理的大小,以下操作是有效的

QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget({ { texture } });
rt->create();
// ...
texture->setPixelSize(new_size);
texture->create();
cb->beginPass(rt, colorClear, dsClear); // this is ok, no explicit rt->create() is required before

flags允许控制某些高级功能。常用标志之一是ExternalContents。每次在由此函数启动的通道中调用beginExternal()时,都应该指定此标志。

另请参阅 endPass()和BeginPassFlags

void QRhiCommandBuffer::debugMarkBegin(const QByteArray &name)

在命令缓冲区中记录一个名为name的调试组。这会在如RenderDocXCode之类的图形调试工具中显示。组结束由debugMarkEnd()标识。

注意: QRhi::DebugMarkers不受支持或QRhi::EnableDebugMarkers未设置时,将忽略此命令。

注意: 可以在帧内的任何位置调用此函数,包括通道内外。

void QRhiCommandBuffer::debugMarkEnd()

记录调试组的结束。

注意: QRhi::DebugMarkers不受支持或QRhi::EnableDebugMarkers未设置时,将忽略此命令。

注意: 可以在帧内的任何位置调用此函数,包括通道内外。

void QRhiCommandBuffer::debugMarkMsg(const QByteArray &msg)

将调试消息msg插入到命令流中。

注意: QRhi::DebugMarkers不受支持或QRhi::EnableDebugMarkers未设置时,将忽略此命令。

注意: 在某些后端中,只有当在通道内部调用时,debugMarkMsg()才受支持,并且当在通道外部调用时将被忽略。在其他后端中,它可以在帧内的任何位置记录。

void QRhiCommandBuffer::dispatch(int x, int y, int z)

记录分发计算工作项,其中xyz分别指定对应维度的本地工作组的数量。

注意:此功能只能在计算过程中调用,即在 beginComputePass() 和 endComputePass() 调用之间。

注意: xyz 必须在运行时适应底层图形API实现的限制。最大值通常是 65535。

注意:还要注意本地工作组大小的可能限制。这由着色器指定,例如:layout(local_size_x = 16, local_size_y = 16) in;。例如,对于OpenGL,规范要求的单个本地工作组调用次数(local_size_xlocal_size_ylocal_size_z 的乘积)的最小值是 1024,而对于OpenGL ES(3.1),该值可能低至 128。这意味着上面的示例可能由于调用次数为 256 而被某些 OpenGL ES 实现拒绝。

void QRhiCommandBuffer::draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)

记录一个非索引绘制。

顶点数在 vertexCount 中指定。对于实例绘制,将 instanceCount 设置为非 1 的值。《firstVertex》是绘制第一个顶点的索引。绘制多个实例时,通过 firstInstance 指定第一个实例 ID。

注意: firstInstance 可能不受支持,并且当 QRhi::BaseInstance 功能报告为不受支持时会被忽略。在这种情况下,第一个 ID 总是 0。

注意:此函数只能在渲染过程中调用,即在 beginPass() 和 endPass() 调用之间。

void QRhiCommandBuffer::drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0)

记录一个索引绘制。

顶点数在 indexCount 中指定。《firstIndex》是基础索引。索引缓冲区中的有效偏移由公式给出 indexOffset + firstIndex * n 其中 n 根据索引元素类型为 2 或 4。《indexOffset》在 setVertexInput() 中指定。

注意:某些后端(例如,Metal)的索引缓冲区中的有效偏移必须是 4 字节对齐的。在这些后端中,NonFourAlignedEffectiveIndexBufferOffset 功能将报告为不受支持。

对于实例绘制,将 instanceCount 设置为非 1 的值。绘制多个实例时,通过 firstInstance 指定第一个实例 ID。

注意: firstInstance 可能不受支持,并且当 QRhi::BaseInstance 功能报告为不受支持时会被忽略。在这种情况下,第一个 ID 总是 0。

vertexOffset(也称为 基础顶点)是一个有符号值,它在索引顶点缓冲区之前添加到元素索引中。这种支持并不总是可用,并且当报告特性 QRhi::BaseVertex 不受支持时,该值会被忽略。

注意:此函数只能在渲染过程中调用,即在 beginPass() 和 endPass() 调用之间。

void QRhiCommandBuffer::endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)

记录当前计算绘制结束。

资源更新,当不为空时,指定要提交并释放的资源更新批次。

void QRhiCommandBuffer::endExternal()

当外部添加的命令记录到命令缓冲区或上下文时,调用一次。

注意:在调用此函数后,必须假定所有 QRhiCommandBuffer 状态为无效。如果在外部命令之后记录更多的绘制调用,则必须重新设置管线、顶点和索引缓冲区以及其他状态。

另请参阅:beginExternal() 和 nativeHandles

void QRhiCommandBuffer::endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)

记录当前渲染绘制结束。

资源更新,当不为空时,指定要提交并释放的资源更新批次。

另请参阅:beginPass

double QRhiCommandBuffer::lastCompletedGpuTime()

返回创建 QRhi 时候启用 QRhi::EnableTimestamps 时最后可用的时间戳,单位为秒。该值表示上次完成帧在 GPU 上的流逝时间。

注意:QRhi::Timestamps 特性不被报告为支持,或者当没有将 QRhi::EnableTimestamps 传递给 QRhi::create 时,不要期望得到除了 0 之外的结果。存在例外,因为对于某些图形 API(如 Metal),无需执行额外操作(时间戳查询)即可获得计时信息,但可移植应用程序应当始终在知道需要的时候有意识地启用时间戳收集,并相应地调用此函数。

在解释值时必须小心,因为其精度和粒度通常不由 Qt 控制,而是取决于底层图形 API 及其实现。特别是,不鼓励在不同图形 API 和硬件之间比较值,这可能毫无意义。

当使用 beginFrame() 和 endFrame 记录帧时,即使用到交换链,计时值将很可能异步可用。因此,返回的值可能是 0(例如,对于前 1-2 帧)或指涉某个先前帧的最后已知值。在某些条件下,例如窗口大小调整时,值也可能再次变为 0。有理由期望在 beginFrame() 返回后,通过此函数检索到最新的可用值。

注意:不要假设该值指代上一个(code translate="no">currently_recorded - 1)帧。它也可能指代 currently_recorded - 2currently_recorded - 3。确切的行為可能取决于图形 API 及其实现。

另一方面,对于离屏帧,当 endOffscreenFrame() 返回时,返回的值是当前的,因为离屏帧减少了 GPU 管线并等待命令完成。

注意:这表示,与交换链帧不同,使用离屏帧返回的值保证指向刚刚提交并完成的帧。(假设在调用endOffscreenFrame()之后、调用beginOffscreenFrame()之前调用此函数)

请注意,GPU频率缩放和GPU时钟变化的影响,这取决于平台。例如,在Windows上,有些现代显卡在不同帧之间返回的定时可能会在一个相当大的范围内变化,即使在提交具有类似或相同工作负载的帧时也是如此。这通常超出了Qt的控制和解决问题的范围。然而,当环境变量QT_D3D_STABLE_POWER_STATE设置为非零值时,D3D12后端会自动调用ID3D12Device::SetStablePowerState()。这可以大大稳定结果。它还可以对例如通过QElapsedTimer测量的CPU侧定时产生非微不足道的影响,尤其是在涉及离屏帧时。

注意:请不要在生产应用程序中设置QT_D3D_STABLE_POWER_STATE。有关详细信息,请参阅Windows API文档。

另请参阅:QRhi::TimestampsQRhi::EnableTimestamps

const QRhiNativeHandles *QRhiCommandBuffer::nativeHandles()

返回一个指向后端特有的QRhiNativeHandles子类的指针,例如QRhiVulkanCommandBufferNativeHandles。当后端不支持或不适用公开底层本地资源时,返回值是nullptr

另请参阅:QRhiVulkanCommandBufferNativeHandlesQRhiMetalCommandBufferNativeHandlesbeginExternal()和endExternal

[重写虚函数] QRhiResource::Type QRhiCommandBuffer::resourceType() const

重写:QRhiResource::resourceType() const.

返回资源类型。

void QRhiCommandBuffer::resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)

有时在没有开始渲染传递的情况下提交资源更新是必要的或更加方便。调用此函数将resourceUpdates传递到beginPass()调用(或endPass,这在回读的情况下会很典型)是这种方法的替代。

注意:不可在传递内调用。

void QRhiCommandBuffer::setBlendConstants(const QColor &c)

记录设置活动混合常数为c

此函数只能在已绑定管道具有QRhiGraphicsPipeline::UsesBlendConstants设置时调用。

注意:此函数只能在渲染过程中调用,即在 beginPass() 和 endPass() 调用之间。

void QRhiCommandBuffer::setComputePipeline(QRhiComputePipeline *ps)

记录设置新的计算管道ps

注意:在命令缓冲区上记录setShaderResources()或dispatch()命令之前必须调用此函数。

注意:QRhi 会对通行过程中的非必要调用进行优化,因此,在应用程序方面,没有必要过度优化以避免调用此函数。

注意:此功能只能在计算过程中调用,即在 beginComputePass() 和 endComputePass() 调用之间。

void QRhiCommandBuffer::setGraphicsPipeline(QRhiGraphicsPipeline *ps)

记录设置新的图形管线ps

注意:必须在记录命令缓冲区上的其他setdraw命令之前调用此函数。

注意:QRhi 会对通行过程中的非必要调用进行优化,因此,在应用程序方面,没有必要过度优化以避免调用此函数。

注意:此函数只能在渲染过程中调用,即在 beginPass() 和 endPass() 调用之间。

注意:新的图形管线ps必须是一个有效的指针。

void QRhiCommandBuffer::setScissor(const QRhiScissor &scissor)

记录设置在scissor中指定的活动裁剪矩形。

只能在已绑定的管线设置了UsesScissor时调用。当活动管线设置此标志时,必须调用此函数,因为启用裁剪测试,因此必须提供一个裁剪矩形。

注意:QRhi 假设 OpenGL 风格的视口坐标,即 x 和 y 为左下角。

注意:此函数只能在渲染过程中调用,即在 beginPass() 和 endPass() 调用之间。

void QRhiCommandBuffer::setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)

记录绑定一组着色器资源,例如均匀缓冲区或纹理,使您可以将它们制作可见于一个或多个着色器阶段。

srb可以是null,在这种情况下,将使用当前图形或计算管线关联的当前QRhiShaderResourceBindings。当srb非空时,它必须是布局兼容的,即布局(绑定数量、每个绑定的类型和绑定编号)必须完全匹配创建管线时关联的QRhiShaderResourceBindings

在某些情况下,似乎是强制性的不必要的setShaderResources()调用:例如重新构建srb引用的资源,例如在更改QRhiBuffer的大小后调用 QRhiBuffer::create(),这是关联本机对象(如 Vulkan 中的描述符集)更新的地方,以引用从srb引用的当前本机资源,比如 QRhiBufferQRhiTextureQRhiSampler 对象。在这种情况下,即使srb与上一次调用相同,也必须调用setShaderResources()。

srb非空时,在创建()中构建管线时使用的QRhiShaderResourceBindings对象将保证不会以任何形式访问。事实上,甚至在此点上它可能不需要有效:在创建()之后销毁管线关联的srb,并在每次setShaderResources()调用中显式指定另一个布局兼容的一个,这是有效的。

dynamicOffsets 允许指定通过 QRhiShaderResourceBinding::uniformBufferWithDynamicOffset() 与 srb 关联的统一缓冲区偏移量。这不同于在 srb 本身提供偏移量:动态偏移量不需要为每个不同的偏移量构建新的 QRhiShaderResourceBindings,可以避免在适用的后端中写入底层描述符,因此它们可能更有效。每个 dynamicOffsets 的元素都是一个 binding - offset 对。 dynamicOffsetCount 指定了 dynamicOffsets 中的元素数量。

注意: dynamicOffsets 中的所有偏移量必须是从 QRhi::ubufAlignment() 返回值的字节对齐。

注意: 一些后端可能会限制支持的动态偏移量数量。避免使用大于 8 的 dynamicOffsetCount

注意: QRhi 将根据上述条件对每个迭代进行优化,因此应用程序方面无需过度优化以避免调用此函数。

注意: 此函数只能在渲染或计算迭代中调用,即在一个 beginPass() 和 endPass(),或 beginComputePass() 和 endComputePass() 之间。

void QRhiCommandBuffer::setStencilRef(quint32 refValue)

记录将活动模板参考值设置为 refValue 的操作。

只有当绑定的管道设置了 QRhiGraphicsPipeline::UsesStencilRef 时,才能调用此操作。

注意:此函数只能在渲染过程中调用,即在 beginPass() 和 endPass() 调用之间。

void QRhiCommandBuffer::setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)

记录顶点输入绑定。

后续 drawIndexed() 命令使用的索引缓冲区通过 indexBufindexOffsetindexFormat 指定。当不需要索引绘制时,可以将 indexBuf 设置为 null。

顶点缓冲区绑定被批处理。 startBinding 指定第一个绑定编号。记录的命令然后绑定每个 bindings 中的缓冲区到 bindings 点 startBinding + i,其中 ibindings 中的索引。每个 bindings 中的元素指定一个 QRhiBuffer 和一个偏移量。

注意: 一些后端可能会限制顶点缓冲区绑定的数量。避免使用大于 8 的 bindingCount

大多数后端会自动忽略相同迭代中的额外顶点输入和索引更改,因此应用程序不必过度优化以避免调用此函数。

注意:此函数只能在渲染过程中调用,即在 beginPass() 和 endPass() 调用之间。

作为一个简单的例子,考虑一个具有两个输入的顶点着色器

layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;

假设我们有的数据以交错格式可用,只使用2个浮点数表示位置(因此每个顶点有5个浮点数:x,y,r,g,b)。然后可以使用输入布局创建一个 QRhiGraphicsPipeline 用于此着色器。

QRhiVertexInputLayout inputLayout;
inputLayout.setBindings({
    { 5 * sizeof(float) }
});
inputLayout.setAttributes({
    { 0, 0, QRhiVertexInputAttribute::Float2, 0 },
    { 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) }
});

这里有一个缓冲区绑定(绑定编号0),有两个输入引用它。在记录通道时,一旦设置好管道,可以像以下这样简单地指定顶点绑定,假设vbuf是包含所有交错位置+颜色数据的 QRhiBuffer

const QRhiCommandBuffer::VertexInput vbufBinding(vbuf, 0);
cb->setVertexInput(0, 1, &vbufBinding);

void QRhiCommandBuffer::setViewport(const QRhiViewport &viewport)

记录设置由 viewport 指定活动视口矩形。

对于底层图形API默认总是启用剪裁的图形后端,此函数也在活动 QRhiGraphicsPipeline 未设置 UsesScissor 时,设置剪裁以匹配视口。

注意:QRhi 假设 OpenGL 风格的视口坐标,即 x 和 y 为左下角。

注意:此函数只能在渲染过程中调用,即在 beginPass() 和 endPass() 调用之间。

© 2024 Qt公司有限。本文件包含的文档贡献权属于其各自的拥有者。本文件提供的文档根据自由软件基金会发布的 GNU自由文档许可证版本1.3 的条款许可。Qt和相应的标志是芬兰和/或世界各地的Qt公司的商标。所有其他商标均为其各自拥有者的财产。