QRhiCommandBuffer Class
命令缓冲区资源。更多
头文件: | #include <rhi/qrhi.h> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate) |
qmake: | QT += gui-private |
自 | Qt 6.6 |
继承: | QRhiResource |
公共类型
enum | BeginPassFlag { ExternalContent, DoNotTrackResourcesForCompute } |
flags | BeginPassFlags |
DynamicOffset | |
enum | IndexFormat { IndexUInt16, IndexUInt32 } |
VertexInput |
公共函数
void | beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {}) |
void | beginExternal() |
void | beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {}) |
void | debugMarkBegin(const QByteArray &name) |
void | debugMarkEnd() |
void | debugMarkMsg(const QByteArray &msg) |
void | dispatch(int x, int y, int z) |
void | draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0) |
void | drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0) |
void | endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr) |
void | endExternal() |
void | endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr) |
double | lastCompletedGpuTime() |
const QRhiNativeHandles * | nativeHandles() |
void | resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates) |
void | setBlendConstants(const QColor &c) |
void | setComputePipeline(QRhiComputePipeline *ps) |
void | setGraphicsPipeline(QRhiGraphicsPipeline *ps) |
void | setScissor(const QRhiScissor &scissor) |
void | setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr) |
(since 6.9) void | setShadingRate(const QSize &coarsePixelSize) |
void | setStencilRef(quint32 refValue) |
void | setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16) |
void | setViewport(const QRhiViewport &viewport) |
重新实现的公共函数
virtual QRhiResource::Type | resourceType() const override |
详细说明
目前应用程序无法创建。获取有效 QRhiCommandBuffer 的唯一方法是通过QRhiSwapChain::currentFrameCommandBuffer() 从目标 swapchain 获取,或者在完全离屏渲染的情况下,通过QRhi::beginOffscreenFrame() 初始化一个 QRhiCommandBuffer。
注: 这是一个 RHI API,具有有限的兼容性保证,详情请参见QRhi 。
成员类型文档
枚举 QRhiCommandBuffer::BeginPassFlag
flags QRhiCommandBuffer::BeginPassFlags
QRhi::beginPass() 的标志值
常量 | 值 | 说明 |
---|---|---|
QRhiCommandBuffer::ExternalContent | 0x01 | 指定在此过程中将调用QRhiCommandBuffer::beginExternal()。如果未设置此标志且仍调用beginExternal() ,某些后端(尤其是 Vulkan)将会失败。 |
QRhiCommandBuffer::DoNotTrackResourcesForCompute | 0x02 | 如果跟踪的唯一目的是生成计算障碍,则指定无需跟踪本传递中使用的资源。暗示帧中没有计算传递。这是一个优化提示,某些后端(尤其是 OpenGL)可能会将其考虑在内,从而跳过某些操作。如果为帧中的渲染处理设置了该标记,在该帧中调用beginComputePass() 可能会导致意想不到的行为,这取决于渲染处理和计算处理之间的资源依赖关系。 |
BeginPassFlags 类型是QFlags<BeginPassFlag> 的类型定义。它存储 BeginPassFlag 值的 OR 组合。
[alias]
QRhiCommandBuffer::DynamicOffset
std::pair<int, quint32> 的同义词。第一个条目是绑定,第二个条目是缓冲区中的偏移量。
enum QRhiCommandBuffer::IndexFormat
指定索引数据类型
常数 | 值 | 说明 |
---|---|---|
QRhiCommandBuffer::IndexUInt16 | 0 | 无符号 16 位 (quint16) |
QRhiCommandBuffer::IndexUInt32 | 1 | 无符号 32 位 (quint32) |
[alias]
QRhiCommandBuffer::VertexInput
std::pair<QRhiBuffer *, quint32> 的同义词。第二个条目是第一个条目指定的缓冲区中的偏移量。
成员函数文档
void QRhiCommandBuffer::beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
开始新计算传递的记录。
resourceUpdates,如果不为空,则指定要提交然后释放的资源更新批次。
注意: 不要假定任何状态或资源绑定都会在各计算周期之间持续存在。
注意: 计算传递可以记录setComputePipeline(),setShaderResources(), 和dispatch() 调用,但不能记录图形调用。一般功能,如调试标记和beginExternal() 可在呈现和计算传递中使用。
注: 只有在报告支持Compute 功能时,计算功能才可用。
flags 目前尚未使用。
void QRhiCommandBuffer::beginExternal()
在应用程序通过直接调用图形 API 函数将命令顺序排列到当前传递的命令缓冲区之前调用。
注意: 只有在beginPass() 或beginComputePass() 中预先声明了意图时,该函数才可用。因此,只有在通过指定QRhiCommandBuffer::ExternalContent 开始记录时,才能调用此函数。
使用 Vulkan、Metal 或 Direct3D 12 时,可以通过nativeHandles() 查询本地命令缓冲区或编码器对象,并向它们发出命令。对于 OpenGL 或 Direct3D 11,可以通过QRhi::nativeHandles() 获取(设备)上下文。但是,在这样做时必须确保QRhiCommandBuffer 的状态保持最新。因此,需要在 beginExternal() 和endExternal() 之间封装任何外部添加的命令记录。从概念上讲,这与QPainter 的beginNativePainting() 和endNativePainting() 函数相同。
特别是对于 OpenGL,该函数还有一个额外的任务:确保上下文在当前线程上是当前的。
注意: 一旦调用了 beginExternal(),在QRhiCommandBuffer 至endExternal() 之前,不得调用其他特定的呈现传递函数(set*
或draw*
)。
警告: 某些后端可能会从QRhiCommandBuffer::nativeHandles() 返回一个本地命令缓冲区对象,该对象与在 beginExternal() -endExternal() 块内的主对象不同。因此,调用 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 渲染目标开始新的渲染传递。
resourceUpdates如果不为空,则指定了一个要提交然后释放的资源更新批次。
渲染目标的颜色和深度/模板缓冲区通常会被清空。清除值在colorClearValue 和depthStencilClearValue 中指定。使用QRhiTextureRenderTarget::PreserveColorContents 和/或QRhiTextureRenderTarget::PreserveDepthStencilContents 创建渲染目标时例外。此时,清除值将被忽略。
注: 启用保留颜色或深度内容会导致性能下降,具体取决于底层硬件。采用平铺架构的移动 GPU 无需将之前的内容重新加载到平铺缓冲区,因此性能会有所提高。同样,使用QRhiTexture 作为深度缓冲区的QRhiTextureRenderTarget 比QRhiRenderBuffer 的效率要低,因为使用深度纹理需要将数据写入深度缓冲区,而使用渲染缓冲区则不需要(因为 API 不允许从渲染缓冲区采样或读取数据)。
注意: 请勿假定任何状态或资源绑定都会在两次运行之间持续存在。
注意: QRhiCommandBuffer 的set
和draw
函数只能在通行证内部调用。此外,除了setGraphicsPipeline() 之外,它们都希望在命令缓冲区上已经设置了管道。否则可能会出现不明问题,具体取决于后端。
如果rt 是QRhiTextureRenderTarget ,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 在命令缓冲区记录一个命名的调试组。这将显示在RenderDoc和XCode 等图形调试工具中。组的结束用debugMarkEnd() 表示。
注: 不支持QRhi::DebugMarkers 或未设置QRhi::EnableDebugMarkers 时将被忽略。
注: 可在帧内的任何位置调用,包括通道内部和外部。
void QRhiCommandBuffer::debugMarkEnd()
记录调试组的结束。
注: 不支持QRhi::DebugMarkers 或未设置QRhi::EnableDebugMarkers 时忽略。
注: 可在框架内的任何位置调用,包括在通行证内部和外部。
void QRhiCommandBuffer::debugMarkMsg(const QByteArray &msg)
在命令流中插入调试信息msg 。
注: 不支持QRhi::DebugMarkers 或未设置QRhi::EnableDebugMarkers 时将被忽略。
注: 对于某些后端,debugMarkMsg() 只支持在通行证内调用,在通行证外调用时将被忽略。而对于其他后端,则可在帧内的任何位置记录 debugMarkMsg()。
void QRhiCommandBuffer::dispatch(int x, int y, int z)
记录调度计算工作项,其中x,y, 和z 指定相应维度中本地工作组的数量。
注: 此函数只能在计算传递中调用,即在beginComputePass() 和endComputePass() 调用之间调用。
注意: x 、y 和z 必须符合运行时底层图形 API 实现的限制。最大值通常为 65535。
注意: 还要注意本地工作组大小的可能限制。这将在着色器中指定,例如:layout(local_size_x = 16, local_size_y = 16) in;
。例如,对于 OpenGL,规范规定单个本地工作组(local_size_x
、local_size_y
和local_size_z
的乘积)中调用次数的最小值为 1024,而对于 OpenGL ES (3.1),该值可能低至 128。这意味着上述示例可能会被某些 OpenGL ES 实现所拒绝,因为调用次数为 256 次。
void QRhiCommandBuffer::draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)
记录非索引绘制。
顶点数在vertexCount 中指定。若要绘制实例,请将instanceCount 设置为 1 以外的值。firstVertex 是要绘制的第一个顶点的索引。绘制多个实例时,第一个实例 ID 由firstInstance 指定。
注意: firstInstance 可能不受支持,当QRhi::BaseInstance 功能被报告为不受支持时,它将被忽略。在这种情况下,第一个 ID 始终为 0。
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 以外的值。绘制多个实例时,第一个实例 ID 由firstInstance 指定。
注意: firstInstance 可能不受支持,当QRhi::BaseInstance 功能被报告为不支持时,它将被忽略。在这种情况下,第一个 ID 始终为 0。
vertexOffset (也称为 )是一个带符号的值,在索引到顶点缓冲区之前会添加到元素索引中。并不总是支持该值,当特征 被报告为不支持时,该值将被忽略。base vertex
QRhi::BaseVertex
void QRhiCommandBuffer::endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
结束当前计算传递的记录。
resourceUpdates如果不为空,则指定要提交然后释放的资源更新批次。
void QRhiCommandBuffer::endExternal()
外部添加的命令记录到命令缓冲区或上下文后调用。
注意: 调用此函数后,所有QRhiCommandBuffer 状态都必须假定为无效。如果在外部命令后记录了更多绘图调用,则必须重新设置管道、顶点和索引缓冲区以及其他状态。
另请参阅 beginExternal() 和nativeHandles()。
void QRhiCommandBuffer::endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
结束当前渲染传递的记录。
resourceUpdates,如果不为空,则指定要提交然后释放的资源更新批次。
另请参见 beginPass()。
double QRhiCommandBuffer::lastCompletedGpuTime()
返回在创建QRhi 时启用QRhi::EnableTimestamps 的最后可用时间戳(以秒为单位)。该值表示在最后完成的帧中 GPU 上经过的时间。
注意: 当报告不支持QRhi::Timestamps 功能,或未将QRhi::EnableTimestamps 传递给QRhi::create() 时,不要期待 0 以外的结果。也有例外情况,因为某些图形应用程序接口(Metal)无需执行额外操作(时间戳查询)即可获得时间戳,但便携式应用程序在知道需要收集时间戳时,应始终有意识地选择收集时间戳,并相应地调用此函数。
必须谨慎解释该值,因为其精度和粒度通常不受 Qt 控制,而取决于底层图形 API 及其实现。尤其不鼓励在不同图形 API 和硬件之间比较数值,这样做可能毫无意义。
当使用beginFrame() 和endFrame() 记录帧时,即使用交换链时,时序值可能会异步可用。因此,返回的值可能是 0(例如,前 1-2 帧),或者是某个前一帧的最后已知值。在某些情况下,例如调整窗口大小时,该值可能会再次变为 0。可以预期的是,最新的可用值会在 beginFrame() 中获取,并在 beginFrame() 返回后通过该函数进行查询。
注意: 不要认为该值指的是上一帧(currently_recorded - 1
)。它也可能指currently_recorded - 2
或currently_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::Timestamps 和QRhi::EnableTimestamps 。
const QRhiNativeHandles *QRhiCommandBuffer::nativeHandles()
返回指向特定于后端QRhiNativeHandles 子类(如QRhiVulkanCommandBufferNativeHandles )的指针。当后端不支持或不适用底层本地资源时,返回值为nullptr
。
另请参阅 QRhiVulkanCommandBufferNativeHandles,QRhiMetalCommandBufferNativeHandles,beginExternal() 和endExternal() 。
[override virtual]
QRhiResource::Type QRhiCommandBuffer::resourceType() const
重实现:QRhiResource::resourceType() 常量。
返回资源类型。
void QRhiCommandBuffer::resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)
有时,提交资源更新是必要的,或者在不启动渲染传递的情况下更方便。resourceUpdates 在调用beginPass() 或endPass() 时,可以通过resourceUpdates 调用此函数,这在回读情况下比较常见。
注意: 不能在传递过程中调用。
void QRhiCommandBuffer::setBlendConstants(const QColor &c)
将活动混合常量设置为c 的记录。
只有在绑定流水线已设置QRhiGraphicsPipeline::UsesBlendConstants 时才能调用此函数。
void QRhiCommandBuffer::setComputePipeline(QRhiComputePipeline *ps)
记录设置新计算管道ps 。
注意: 必须在命令缓冲区记录setShaderResources() 或dispatch() 命令之前调用此函数。
注: QRhi 会优化计算通道内不必要的调用,因此应用程序无需为避免调用此函数而进行过度优化。
注意: 此函数只能在计算传递内调用,即在beginComputePass() 和endComputePass() 调用之间调用。
void QRhiCommandBuffer::setGraphicsPipeline(QRhiGraphicsPipeline *ps)
记录设置新图形流水线ps 。
注意: 必须在命令缓冲区记录其他set
或draw
命令之前调用此函数。
注: QRhi 会优化一次传递中不必要的调用,因此应用程序无需为避免调用此函数而进行过度优化。
注意: 新图形管道ps 必须是一个有效指针。
void QRhiCommandBuffer::setScissor(const QRhiScissor &scissor)
记录设置scissor 中指定的活动剪刀矩形。
只有当绑定流水线已设置UsesScissor 时,才能调用此函数。当活动流水线上的标志被设置时,必须调用此函数,因为剪刀测试将被启用,因此必须提供一个剪刀矩形。
注: QRhi 假定为 OpenGL 风格视口坐标,即 x 和 y 均为左下角。
void QRhiCommandBuffer::setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)
绑定一组着色器资源(如均匀缓冲区或纹理)的记录,这些资源对一个或多个着色器阶段可见。
srb 可以为空,在这种情况下,将使用当前图形或计算流水线的相关 。当 为非空时,它必须是 ,这意味着布局(绑定的数量、每个绑定的类型和绑定编号)必须与调用管道的创建()时与管道关联的 完全匹配。QRhiShaderResourceBindings srb layout-compatible QRhiShaderResourceBindings
在某些情况下,调用 setShaderResources() 看似没有必要,但却是必须的:在重建从srb 引用的资源时,例如改变QRhiBuffer 的大小,然后是QRhiBuffer::create() 时,相关的本地对象(如 Vulkan 的描述符集)会在此处更新,以引用当前的本地资源,这些资源支持从srb 引用的QRhiBuffer 、QRhiTexture 、QRhiSampler 对象。在这种情况下,即使srb 与上次调用的相同,也必须调用 setShaderResources()。
当srb 不为空时,管道在 create() 中创建的QRhiShaderResourceBindings 对象保证不会以任何形式被访问。事实上,即使在这一点上,它也不需要是有效的:在 create() 之后销毁管道的相关 srb,并在每次 setShaderResources() 调用中明确指定另一个layout compatible 的 srb 也是有效的。
dynamicOffsets 允许为通过 () 与 关联的统一缓冲区指定缓冲区偏移量。这与在 中提供偏移量本身不同:动态偏移量不需要为每个不同的偏移量构建新的 ,可以避免写入底层描述符(如果适用,还可以写入后端),因此可能更高效。 中的每个元素都是一对 - 。 指定 中元素的数量。QRhiShaderResourceBinding::uniformBufferWithDynamicOffset srb srb QRhiShaderResourceBindings dynamicOffsets binding
offset
dynamicOffsetCount dynamicOffsets
注意: dynamicOffsets 中的所有偏移量必须与QRhi::ubufAlignment() 返回的值字节对齐。
注意: 某些后端可能会限制支持的动态偏移量。请避免使用大于 8 的dynamicOffsetCount 。
注: QRhi 会优化一次传递中不必要的调用(考虑到上述条件),因此应用程序无需为避免调用此函数而进行过度优化。
注意: 此函数只能在渲染或计算过程中调用,即在beginPass() 和endPass() 或beginComputePass() 和endComputePass() 之间调用。
[since 6.9]
void QRhiCommandBuffer::setShadingRate(const QSize &coarsePixelSize)
将后续绘制调用的着色率设置为coarsePixelSize 。
默认为 1x1。
仅当报告支持QRhi::VariableRateShading 功能,且绑定在命令缓冲区上的QRhiGraphicsPipeline(s) 在创建时声明QRhiGraphicsPipeline::UsesShadingRate 时才起作用。
调用QRhi::supportedShadingRates() 检查给定采样计数支持哪些着色率。
当QRhiShadingRateMap 和此函数同时使用时,每个磁贴将使用两个着色率中较高的一个。目前无法控制组合器行为。
此函数在 Qt 6.9 中引入。
void QRhiCommandBuffer::setStencilRef(quint32 refValue)
将活动模板参考值设置为refValue 的记录。
只有在绑定流水线已设置QRhiGraphicsPipeline::UsesStencilRef 时才能调用此函数。
void QRhiCommandBuffer::setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)
记录顶点输入绑定。
后续drawIndexed() 命令使用的索引缓冲区由indexBuf 、indexOffset 和indexFormat 指定。当不需要索引绘图时,可将indexBuf 设置为空。
顶点缓冲区绑定是分批进行的。startBinding 指定第一个绑定编号。然后,记录命令将bindings 中的每个缓冲区绑定到绑定点startBinding + i
,其中i
是bindings 中的索引。bindings 中的每个元素都指定了QRhiBuffer 和偏移量。
注意: 某些后端可能会限制顶点缓冲区绑定的数量。避免使用大于 8 的bindingCount 。
大多数后端都会自动忽略同一传递中多余的顶点输入和索引变化,因此应用程序无需过度优化以避免调用此函数。
举个简单的例子,顶点着色器有两个输入:
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 均为左下角。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.