QRhiCommandBuffer Class
Recurso de memoria intermedia de comandos. Más...
| Cabecera: | #include <rhi/qrhi.h> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate) |
| qmake: | QT += gui-private |
| Desde: | Qt 6.6 |
| Hereda: | QRhiResource |
Tipos Públicos
| enum | BeginPassFlag { ExternalContent, DoNotTrackResourcesForCompute } |
| flags | BeginPassFlags |
| DynamicOffset | |
| enum | IndexFormat { IndexUInt16, IndexUInt32 } |
| VertexInput |
Funciones Públicas
| 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) |
Funciones Públicas Reimplementadas
| virtual QRhiResource::Type | resourceType() const override |
Descripción detallada
No creable por aplicaciones por el momento. Las únicas formas de obtener un QRhiCommandBuffer válido son obtenerlo de la swapchain objetivo a través de QRhiSwapChain::currentFrameCommandBuffer(), o, en caso de renderizar completamente fuera de pantalla, inicializando uno a través de QRhi::beginOffscreenFrame().
Nota: Esta es una API RHI con garantías de compatibilidad limitadas, ver QRhi para más detalles.
Documentación de tipos de miembros
enum QRhiCommandBuffer::BeginPassFlag
flags QRhiCommandBuffer::BeginPassFlags
Valores de bandera para QRhi::beginPass()
| Constante | Valor | Descripción |
|---|---|---|
QRhiCommandBuffer::ExternalContent | 0x01 | Especifica que habrá una llamada a QRhiCommandBuffer::beginExternal() en este pase. Algunos backends, Vulkan en particular, fallarán si no se establece esta bandera y se sigue llamando a beginExternal(). |
QRhiCommandBuffer::DoNotTrackResourcesForCompute | 0x02 | Especifica que no es necesario realizar un seguimiento de los recursos utilizados en este pase si el único propósito de dicho seguimiento es generar barreras para el cómputo. Implica que no hay pases de cálculo en la trama. Esta es una pista de optimización que puede ser tenida en cuenta por ciertos backends, OpenGL en particular, permitiéndoles saltarse ciertas operaciones. Cuando esta bandera está activada para un pase de renderizado en un fotograma, llamar a beginComputePass() en ese fotograma puede llevar a un comportamiento inesperado, dependiendo de las dependencias de recursos entre los pases de renderizado y de cálculo. |
El tipo BeginPassFlags es un typedef para QFlags<BeginPassFlag>. Almacena una combinación OR de valores BeginPassFlag.
[alias] QRhiCommandBuffer::DynamicOffset
Sinónimo de std::pair<int, quint32>. La primera entrada es el enlace, la segunda es el desplazamiento en el búfer.
enum QRhiCommandBuffer::IndexFormat
Especifica el tipo de datos del índice
| Constante | Valor | Descripción |
|---|---|---|
QRhiCommandBuffer::IndexUInt16 | 0 | 16 bits sin signo (quint16) |
QRhiCommandBuffer::IndexUInt32 | 1 | 32 bits sin signo (quint32) |
[alias] QRhiCommandBuffer::VertexInput
Sinónimo de std::pair<QRhiBuffer *, quint32>. La segunda entrada es un desplazamiento en el búfer especificado por la primera.
Documentación de las funciones miembro
void QRhiCommandBuffer::beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
Registra el inicio de un nuevo paso de cálculo.
resourceUpdatescuando no es nulo, especifica un lote de actualización de recursos que debe confirmarse y luego liberarse.
Nota: No asuma que ningún estado o recurso persiste entre pases.
Nota: Un pase de cálculo puede registrar llamadas a setComputePipeline(), setShaderResources() y dispatch(), pero no a gráficos. La funcionalidad general, como los marcadores de depuración y beginExternal() está disponible tanto en pases de renderizado como de cálculo.
Nota: Compute sólo está disponible cuando la función Compute es reportada como soportada.
flags no se utiliza actualmente.
void QRhiCommandBuffer::beginExternal()
Se invoca cuando la aplicación está a punto de poner en cola comandos en el búfer de comandos del pase actual llamando directamente a funciones de la API gráfica.
Nota: Esta función sólo está disponible cuando la intención se declaró por adelantado en beginPass() o beginComputePass(). Por lo tanto, esta función sólo debe llamarse cuando la grabación del pase se inició especificando QRhiCommandBuffer::ExternalContent.
Con Vulkan, Metal o Direct3D 12 se puede consultar el buffer de comandos nativo o los objetos codificadores a través de nativeHandles() y poner en cola comandos para ellos. Con OpenGL o Direct3D 11 el contexto (dispositivo) puede ser recuperado desde QRhi::nativeHandles(). Sin embargo, esto nunca debe hacerse sin asegurarse de que el estado de QRhiCommandBuffer se mantiene actualizado. De ahí el requisito de envolver cualquier grabación de comando añadido externamente entre beginExternal() y endExternal(). Conceptualmente es lo mismo que las funciones beginNativePainting() y endNativePainting() de QPainter.
Para OpenGL en particular, esta función tiene una tarea adicional: se asegura de que el contexto se hace actual en el hilo actual.
Nota: Una vez que beginExternal() es llamada, ninguna otra función específica de render pass (set* o draw*) debe ser llamada en QRhiCommandBuffer hasta endExternal().
Advertencia: Algunos backends pueden devolver un objeto de buffer de comandos nativo desde QRhiCommandBuffer::nativeHandles() que es diferente del primario cuando se está dentro de un bloque beginExternal() - endExternal(). Por lo tanto, es importante (re)consultar el objeto buffer de comandos nativo después de llamar a beginExternal(). En términos prácticos esto significa que con Vulkan, por ejemplo, los comandos Vulkan grabados externamente se colocan en un buffer de comandos secundario (con VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT). nativeHandles() devuelve este búfer de comandos secundario cuando se llama entre begin/endExternal.
Véase también endExternal() y nativeHandles().
void QRhiCommandBuffer::beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
Registra el inicio de un nuevo pase de renderizado dirigido al objetivo de renderizado rt.
resourceUpdatescuando no es nulo, especifica un lote de actualización de recursos que debe ser consignado y luego liberado.
Los buffers de color y profundidad/esténcil del objetivo de renderizado se borran normalmente. Los valores de borrado se especifican en colorClearValue y depthStencilClearValue. La excepción es cuando el objetivo de render se creó con QRhiTextureRenderTarget::PreserveColorContents y/o QRhiTextureRenderTarget::PreserveDepthStencilContents. En este caso, los valores de borrado se ignoran.
Nota: Activar la preservación de los contenidos de color o profundidad conlleva una disminución del rendimiento dependiendo del hardware subyacente. Las GPUs móviles con arquitectura de mosaico se benefician de no tener que recargar los contenidos anteriores en el búfer de mosaico. Del mismo modo, un QRhiTextureRenderTarget con un QRhiTexture como el búfer de profundidad es menos eficiente que un QRhiRenderBuffer ya que el uso de una textura de profundidad desencadena la necesidad de escribir los datos a la misma, mientras que con renderbuffers esto no es necesario (ya que la API no permite el muestreo o la lectura de un renderbuffer).
Nota: No asumas que ningún estado o recurso persiste entre pasadas.
Nota: Las funciones set y draw de QRhiCommandBuffer sólo pueden invocarse dentro de un pase. Además, con la excepción de setGraphicsPipeline(), esperan tener un pipeline establecido ya en el buffer de comandos. De lo contrario, pueden surgir problemas no especificados, dependiendo del backend.
Si rt es un QRhiTextureRenderTarget, beginPass() realiza una comprobación para ver si la textura y los objetos renderbuffer referenciados desde el objetivo de renderizado están actualizados. Esto es similar a lo que setShaderResources() hace para QRhiShaderResourceBindings. Si alguno de los anexos ha sido reconstruido desde QRhiTextureRenderTarget::create(), se realiza una llamada implícita a create() en rt. Por lo tanto, si rt tiene un adjunto de color QRhiTexture texture , y uno necesita hacer la textura de un tamaño diferente, lo siguiente es entonces válido:
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 permiten controlar ciertas funcionalidades avanzadas. Una bandera de uso común es ExternalContents. Debe especificarse siempre que se vaya a llamar a beginExternal() dentro del pase iniciado por esta función.
Véase también endPass() y BeginPassFlags.
void QRhiCommandBuffer::debugMarkBegin(const QByteArray &name)
Registra un grupo de depuración nombrado en el búfer de comandos con la dirección name especificada. Esto se muestra en herramientas de depuración de gráficos como RenderDoc y XCode. El final de la agrupación se indica mediante debugMarkEnd().
Nota: Se ignora cuando QRhi::DebugMarkers no está soportado o QRhi::EnableDebugMarkers no está establecido.
Nota: Puede ser llamado en cualquier lugar dentro del marco, tanto dentro como fuera de los pases.
void QRhiCommandBuffer::debugMarkEnd()
Registra el final de un grupo de depuración.
Nota: Se ignora cuando QRhi::DebugMarkers no está soportado o QRhi::EnableDebugMarkers no está configurado.
Nota: Puede ser llamado en cualquier lugar dentro del marco, tanto dentro como fuera de pases.
void QRhiCommandBuffer::debugMarkMsg(const QByteArray &msg)
Inserta un mensaje de depuración msg en el flujo de comandos.
Nota: Se ignora cuando QRhi::DebugMarkers no está soportado o QRhi::EnableDebugMarkers no está establecido.
Nota: Con algunos backends debugMarkMsg() sólo se soporta dentro de un pase y se ignora cuando se llama fuera de un pase. Con otros se registra en cualquier lugar dentro del frame.
void QRhiCommandBuffer::dispatch(int x, int y, int z)
Registra el envío de elementos de trabajo de cálculo, con x, y, y z especificando el número de grupos de trabajo locales en la dimensión correspondiente.
Nota: Esta función sólo puede ser llamada dentro de un pase de cómputo, es decir, entre una llamada a beginComputePass() y endComputePass().
Nota: x, y, y z deben ajustarse a los límites de la implementación de la API gráfica subyacente en tiempo de ejecución. Los valores máximos suelen ser 65535.
Nota: Ten cuidado también con los posibles límites en el tamaño del grupo de trabajo local. Esto se especifica en el shader, por ejemplo: layout(local_size_x = 16, local_size_y = 16) in;. Por ejemplo, con OpenGL el valor mínimo exigido por la especificación para el número de invocaciones en un único grupo de trabajo local (el producto de local_size_x, local_size_y, y local_size_z) es 1024, mientras que con OpenGL ES (3.1) el valor puede ser tan bajo como 128. Esto significa que el ejemplo anterior puede ser rechazado por algunas implementaciones de OpenGL ES, ya que el número de invocaciones es 256.
void QRhiCommandBuffer::draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)
Registra un dibujo no indexado.
El número de vértices se especifica en vertexCount. Para dibujar instancias establece instanceCount a un valor distinto de 1. firstVertex es el índice del primer vértice a dibujar. Cuando se dibujan múltiples instancias, el ID de la primera instancia se especifica en firstInstance.
Nota: firstInstance puede no estar soportado, y es ignorado cuando la característica QRhi::BaseInstance es reportada como no soportada. El ID de la primera instancia es siempre 0 en ese caso. QRhi::BaseInstance no está soportado con OpenGL por el momento, principalmente debido a las limitaciones de OpenGL ES, y por lo tanto las aplicaciones portables no deberían ser diseñadas para depender de este argumento.
Nota: Los shaders que necesiten acceder al índice del vértice o instancia actual deben utilizar gl_VertexIndex y gl_InstanceIndex, es decir, las variables integradas compatibles con Vulkan, en lugar de gl_VertexID y gl_InstanceID.
Nota: Cuando firstInstance es distinto de cero, gl_InstanceIndex no incluirá el valor base con algunas de las API 3D subyacentes. Esto se indica mediante la función QRhi::InstanceIndexIncludesBaseInstance. Si no se puede evitar depender de un valor base de instancia, se aconseja a las aplicaciones pasar el valor como un uniforme condicionalmente basado en lo que informa esa característica, y añadirlo a gl_InstanceIndex en el shader.
Nota: Esta función sólo puede ser llamada dentro de un pase de renderizado, es decir, entre una llamada a beginPass() y endPass().
void QRhiCommandBuffer::drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0)
Registra un dibujo indexado.
El número de vértices se especifica en indexCount. firstIndex es el índice base. El desplazamiento efectivo en el búfer de índice viene dado por indexOffset + firstIndex * n donde n es 2 o 4 dependiendo del tipo de elemento de índice. indexOffset se especifica en setVertexInput().
Nota: El desplazamiento efectivo en el búfer de índice debe estar alineado a 4 bytes con algunos backends (por ejemplo, Metal). Con estos backends la característica NonFourAlignedEffectiveIndexBufferOffset será reportada como no soportada.
vertexOffset (también llamado base vertex) es un valor con signo que se añade al índice del elemento antes de indexarlo en el búfer de vértices. El soporte para esto no está siempre disponible, y el valor es ignorado cuando la característica QRhi::BaseVertex es reportada como no soportada.
Para dibujar instancias, configure instanceCount con un valor distinto de 1. Cuando se dibujan varias instancias, el ID de la primera instancia se especifica mediante firstInstance.
Nota: firstInstance puede no ser compatible y se ignora cuando la característica QRhi::BaseInstance se notifica como no compatible. El ID de la primera instancia es siempre 0 en ese caso. QRhi::BaseInstance no está soportado con OpenGL por el momento, principalmente debido a las limitaciones de OpenGL ES, y por lo tanto las aplicaciones portables no deberían ser diseñadas para depender de este argumento.
Nota: Los shaders que necesiten acceder al índice del vértice o instancia actual deben utilizar gl_VertexIndex y gl_InstanceIndex, es decir, las variables integradas compatibles con Vulkan, en lugar de gl_VertexID y gl_InstanceID.
Nota: Cuando firstInstance es distinto de cero, gl_InstanceIndex no incluirá el valor base con algunas de las API 3D subyacentes. Esto se indica mediante la función QRhi::InstanceIndexIncludesBaseInstance. Si no se puede evitar depender de un valor base de instancia, se aconseja a las aplicaciones pasar el valor como un uniforme condicionalmente basado en lo que informa esa característica, y añadirlo a gl_InstanceIndex en el shader.
Nota: Esta función sólo puede invocarse dentro de un pase de renderizado, es decir, entre una llamada a beginPass() y endPass().
void QRhiCommandBuffer::endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
Registros que finalizan el pase de cálculo actual.
resourceUpdatescuando no es nulo, especifica un lote de actualización de recursos que debe confirmarse y luego liberarse.
void QRhiCommandBuffer::endExternal()
Para ser llamada una vez que los comandos añadidos externamente son registrados en el buffer de comandos o contexto.
Nota: Todo el estado de QRhiCommandBuffer debe ser asumido como inválido después de llamar a esta función. Las tuberías, buffers de vértices e índices, y otros estados deben ser configurados de nuevo si se registran más llamadas a dibujo después de los comandos externos.
Véase también beginExternal() y nativeHandles().
void QRhiCommandBuffer::endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
Registros que finalizan el pase de renderizado actual.
resourceUpdatescuando no es nulo, especifica un lote de actualización de recursos que debe confirmarse y luego liberarse.
Véase también beginPass().
double QRhiCommandBuffer::lastCompletedGpuTime()
Devuelve la última marca de tiempo disponible, en segundos, cuando QRhi::EnableTimestamps estaba habilitada al crear el QRhi. El valor indica el tiempo transcurrido en la GPU durante el último fotograma completado.
Nota: No esperes resultados distintos de 0 cuando la función QRhi::Timestamps no se haya reportado como soportada, o cuando QRhi::EnableTimestamps no se haya pasado a QRhi::create(). Hay excepciones a esto, porque con algunas APIs gráficas (Metal) los timings están disponibles sin tener que realizar operaciones extra (consultas de timestamp), pero las aplicaciones portables deberían siempre optar conscientemente por la recolección de timestamp cuando sepan que es necesaria, y llamar a esta función en consecuencia.
Hay que tener cuidado con la interpretación del valor, ya que su precisión y granularidad a menudo no está controlada por Qt, y depende de la API gráfica subyacente y su implementación. En particular, se desaconseja comparar los valores entre diferentes APIs gráficas y hardware, ya que puede carecer de sentido.
Cuando el fotograma se grabó con beginFrame() y endFrame(), es decir, con una cadena de intercambio, es probable que los valores de temporización estén disponibles de forma asíncrona. Por lo tanto, el valor devuelto puede ser 0 (por ejemplo, para los primeros 1-2 fotogramas) o el último valor conocido referido a algún fotograma anterior. El valor también puede volver a ser 0 en determinadas condiciones, como al cambiar el tamaño de la ventana. Se puede esperar que el valor disponible más actualizado se recupere en beginFrame() y se pueda consultar a través de esta función una vez que retorne beginFrame().
Nota: No asuma que el valor se refiere al frame anterior (currently_recorded - 1). También puede referirse a currently_recorded - 2 o currently_recorded - 3. El comportamiento exacto puede depender de la API gráfica y su implementación.
Por otro lado, con los fotogramas fuera de pantalla el valor devuelto está actualizado una vez que endOffscreenFrame() vuelve, porque los fotogramas fuera de pantalla reducen el pipelining de la GPU y esperan a que los comandos se completen.
Nota: Esto significa que, a diferencia de los fotogramas swapchain, con los fotogramas offscreen el valor devuelto está garantizado para referirse al fotograma que acaba de ser enviado y completado. (suponiendo que esta función se llame después de endOffscreenFrame() pero antes del siguiente beginOffscreenFrame())
Ten cuidado con las consecuencias del escalado de frecuencia de la GPU y los cambios de reloj de la GPU, dependiendo de la plataforma. Por ejemplo, en Windows el tiempo devuelto puede variar en un rango bastante amplio entre fotogramas con tarjetas gráficas modernas, incluso cuando se envían fotogramas con una carga de trabajo similar, o la misma. Esto está fuera del alcance de Qt para controlar y resolver, en términos generales. Sin embargo, el backend D3D12 llama automáticamente a ID3D12Device::SetStablePowerState() siempre que la variable de entorno QT_D3D_STABLE_POWER_STATE se establece en un valor distinto de cero. Esto puede estabilizar mucho el resultado. También puede tener un efecto no insignificante en los tiempos del lado de la CPU medidos a través de QElapsedTimer por ejemplo, especialmente cuando se trata de fotogramas fuera de pantalla.
Nota: No envíe nunca aplicaciones a producción con QT_D3D_STABLE_POWER_STATE configurado. Consulte la documentación de la API de Windows para obtener más información.
Véase también QRhi::Timestamps y QRhi::EnableTimestamps.
const QRhiNativeHandles *QRhiCommandBuffer::nativeHandles()
Devuelve un puntero a una subclase de QRhiNativeHandles específica del backend, como QRhiVulkanCommandBufferNativeHandles. El valor devuelto es nullptr cuando la exposición de los recursos nativos subyacentes no está soportada por, o no es aplicable a, el backend.
Véase también QRhiVulkanCommandBufferNativeHandles, QRhiMetalCommandBufferNativeHandles, beginExternal(), y endExternal().
[override virtual] QRhiResource::Type QRhiCommandBuffer::resourceType() const
Reimplementa: QRhiResource::resourceType() const.
Devuelve el tipo de recurso.
void QRhiCommandBuffer::resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)
A veces es necesario o más conveniente actualizar los recursos sin iniciar un pase de renderizado. Llamar a esta función con resourceUpdates es una alternativa a pasar resourceUpdates a una llamada a beginPass() (o endPass(), que sería lo típico en caso de readbacks).
Nota: No puede ser llamada dentro de un pase.
void QRhiCommandBuffer::setBlendConstants(const QColor &c)
Registra las constantes de mezcla activas en c.
Esto sólo puede ser llamado cuando la tubería de enlace tiene QRhiGraphicsPipeline::UsesBlendConstants establecido.
Nota: Esta función sólo puede ser invocada dentro de un pase de renderizado, es decir, entre una llamada a beginPass() y endPass().
void QRhiCommandBuffer::setComputePipeline(QRhiComputePipeline *ps)
Registra la configuración de un nuevo canal de cálculo ps.
Nota: Esta función debe ser llamada antes de registrar los comandos setShaderResources() o dispatch() en el buffer de comandos.
Nota: QRhi optimizará las invocaciones innecesarias dentro de un pase, por lo que la sobreoptimización para evitar llamadas a esta función no es necesaria por parte de las aplicaciones.
Nota: Esta función sólo puede invocarse dentro de un pase de cálculo, es decir, entre una llamada a beginComputePass() y endComputePass().
void QRhiCommandBuffer::setGraphicsPipeline(QRhiGraphicsPipeline *ps)
Registra la configuración de un nuevo conducto de gráficos ps.
Nota: Esta función debe ser llamada antes de registrar otros comandos set o draw en el buffer de comandos.
Nota: QRhi optimizará las invocaciones innecesarias dentro de un pase, por lo que sobreoptimizar para evitar llamadas a esta función no es necesario por parte de las aplicaciones.
Nota: Esta función sólo puede ser invocada dentro de un pase de renderizado, es decir, entre una llamada a beginPass() y endPass().
Nota: El nuevo canal gráfico ps debe ser un puntero válido.
void QRhiCommandBuffer::setScissor(const QRhiScissor &scissor)
Registra el ajuste del rectángulo de tijera activo especificado en scissor.
Esto sólo puede ser llamado cuando la tubería vinculada tiene UsesScissor establecido. Cuando la bandera se establece en la tubería activa, esta función debe ser llamada porque la prueba de tijera se activará y por lo tanto un rectángulo de tijera debe ser proporcionado.
Nota: QRhi asume coordenadas de vista estilo OpenGL, lo que significa que x e y están en la parte inferior izquierda.
Nota: Esta función sólo puede ser invocada dentro de un pase de renderizado, es decir, entre una llamada a beginPass() y endPass().
void QRhiCommandBuffer::setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)
Registra un conjunto de recursos de sombreado, como memorias intermedias uniformes o texturas, que se hacen visibles para una o más etapas de sombreado.
srb puede ser nulo, en cuyo caso se utilizará el canal gráfico o de cálculo actual asociado a QRhiShaderResourceBindings. Cuando srb no es nulo, debe ser layout-compatible, lo que significa que el diseño (número de vinculaciones, el tipo y el número de vinculación de cada vinculación) debe coincidir totalmente con el QRhiShaderResourceBindings que se asoció con la canalización en el momento de llamar a create() de la canalización.
Hay casos en los que una llamada aparentemente innecesaria a setShaderResources() es obligatoria: cuando se reconstruye un recurso referenciado desde srb, por ejemplo cambiando el tamaño de un QRhiBuffer seguido de un QRhiBuffer::create(), este es el lugar donde los objetos nativos asociados (como los conjuntos de descriptores en el caso de Vulkan) se actualizan para referirse a los recursos nativos actuales que respaldan los objetos QRhiBuffer, QRhiTexture, QRhiSampler referenciados desde srb. En este caso se debe llamar a setShaderResources() incluso si srb es el mismo que en la última llamada.
Cuando srb no es null, se garantiza que no se accede de ninguna forma al objeto QRhiShaderResourceBindings con el que se construyó el pipeline en create(). De hecho, no necesita ser válido incluso en este punto: destruir el srb asociado a la canalización después de create() y en su lugar especificar explícitamente otro, layout compatible en cada llamada a setShaderResources() es válido.
dynamicOffsets permite especificar desplazamientos de búfer para búferes uniformes que estaban asociados a srb a través de QRhiShaderResourceBinding::uniformBufferWithDynamicOffset(). Esto es diferente de proporcionar el offset en el propio srb: los offsets dinámicos no requieren construir un nuevo QRhiShaderResourceBindings para cada offset diferente, pueden evitar escribir los descriptores subyacentes (con backends donde sea aplicable), y por lo tanto pueden ser más eficientes. Cada elemento de dynamicOffsets es un par binding - offset. dynamicOffsetCount especifica el número de elementos en dynamicOffsets.
Nota: Todos los desplazamientos en dynamicOffsets deben estar alineados con el valor devuelto por QRhi::ubufAlignment().
Nota: Algunos backends pueden limitar el número de offsets dinámicos soportados. Evite utilizar un dynamicOffsetCount mayor que 8.
Nota: QRhi optimizará las invocaciones innecesarias dentro de una pasada (teniendo en cuenta las condiciones descritas anteriormente), por lo que la sobreoptimización para evitar llamadas a esta función no es necesaria por parte de las aplicaciones.
Nota: Esta función sólo puede invocarse dentro de un pase de renderizado o cálculo, es decir, entre beginPass() y endPass(), o beginComputePass() y endComputePass().
[since 6.9] void QRhiCommandBuffer::setShadingRate(const QSize &coarsePixelSize)
Establece la tasa de sombreado para las siguientes llamadas a coarsePixelSize.
El valor por defecto es 1x1.
Funcional sólo cuando la característica QRhi::VariableRateShading es reportada como soportada y los QRhiGraphicsPipeline(s) ligados en el buffer de comandos declaraban QRhiGraphicsPipeline::UsesShadingRate al crearlos.
Llame a QRhi::supportedShadingRates() para comprobar qué tasas de sombreado se admiten para un recuento de muestras determinado.
Cuando se utilizan tanto QRhiShadingRateMap como esta función, se utiliza la mayor de las dos tasas de sombreado para cada mosaico. Actualmente no se ofrece ningún control sobre el comportamiento del combinador.
Esta función se introdujo en Qt 6.9.
void QRhiCommandBuffer::setStencilRef(quint32 refValue)
Registra el valor de referencia del esténcil activo en refValue.
Esta función sólo puede invocarse cuando el canal de renderización vinculado tiene QRhiGraphicsPipeline::UsesStencilRef establecido.
Nota: Esta función sólo puede ser llamada dentro de un pase de renderizado, es decir, entre una llamada a beginPass() y endPass().
void QRhiCommandBuffer::setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)
Registra los enlaces de entrada de vértices.
El búfer de índice utilizado por los comandos drawIndexed() subsiguientes se especifica mediante indexBuf, indexOffset, y indexFormat. indexBuf puede establecerse como nulo cuando no se necesita el dibujo indexado.
Las vinculaciones de búferes de vértices se realizan por lotes. startBinding especifica el primer número de vinculación. El comando grabado enlaza cada búfer desde bindings al punto de enlace startBinding + i donde i es el índice en bindings. Cada elemento de bindings especifica un QRhiBuffer y un desplazamiento.
Nota: Algunos backends pueden limitar el número de enlaces de búfer de vértice. Evita utilizar un bindingCount mayor de 8.
Las entradas de vértices superfluas y los cambios de índice en la misma pasada se ignoran automáticamente con la mayoría de los backends y, por lo tanto, las aplicaciones no necesitan sobreoptimizar para evitar llamadas a esta función.
Nota: Esta función sólo puede ser llamada dentro de un pase de renderizado, es decir, entre una llamada a beginPass() y endPass().
Como ejemplo simple, tomemos un vertex shader con dos entradas:
layout(location = 0) in vec4 position; layout(location = 1) in vec3 color;
y supongamos que tenemos los datos disponibles en formato intercalado, usando sólo 2 floats para la posición (así que 5 floats por vértice: x, y, r, g, b). Un QRhiGraphicsPipeline para este shader puede ser creado usando el layout de entrada:
QRhiVertexInputLayout inputLayout; inputLayout.setBindings({ { 5 * sizeof(float) } }); inputLayout.setAttributes({ { 0, 0, QRhiVertexInputAttribute::Float2, 0 }, { 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) } });
Aquí hay un buffer binding (binding número 0), con dos inputs referenciándolo. Cuando se graba el pase, una vez que el pipeline está configurado, los vertex bindings se pueden especificar simplemente como sigue, asumiendo que vbuf es el QRhiBuffer con todos los datos de posición+color intercalados:
const QRhiCommandBuffer::VertexInput vbufBinding(vbuf, 0); cb->setVertexInput(0, 1, &vbufBinding);
void QRhiCommandBuffer::setViewport(const QRhiViewport &viewport)
Registra el rectángulo activo de la ventana gráfica especificado en viewport.
Con backends donde la API gráfica subyacente tiene la tijera siempre activada, esta función también establece la tijera para que coincida con la ventana gráfica siempre que la QRhiGraphicsPipeline activa no tenga UsesScissor establecido.
Nota: QRhi asume coordenadas de vista estilo OpenGL, lo que significa que x e y están en la parte inferior izquierda.
© 2026 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.