En esta página

Qt Quick Arquitectura 3D

Qt Quick 3D amplía Qt Quick para soportar el renderizado de contenido 3D. Añade una amplia funcionalidad, incluidas varias importaciones QML públicas nuevas, así como un nuevo gráfico de escena y renderizador internos. Este documento describe la arquitectura de Qt Quick 3D desde la API pública hasta los detalles del funcionamiento del canal de renderizado.

Visión general de los módulos

Qt Quick 3D consta de varios módulos y plugins que exponen las API 3D adicionales, así como utilidades para acondicionar e importar activos 3D existentes.

Importaciones QML

  • QtQuick3D - La importación principal que contiene todos los componentes principales de Qt Quick 3D
  • QtQuick3D.AssetUtils - Una biblioteca para importar activos 3D en tiempo de ejecución
  • QtQuick3D.Helpers - Una biblioteca de componentes adicionales que pueden utilizarse para ayudar a diseñar y depurar escenas 3D.

Bibliotecas C

  • QtQuick3D - El único módulo C++ público. Contiene las definiciones de todos los tipos expuestos a la importación QML de QtQuick3D, así como algunas API de C++.
  • QtQuick3DAssetImport - Una biblioteca interna y privada para ayudar en la importación de activos y convertir activos a QML.
  • QtQuick3DRuntimeRender - Una biblioteca interna y privada que contiene los nodos del gráfico de escena espacial y el renderizador.
  • QtQuick3DUtils - Una librería interna y privada utilizada como librería de utilidad común por todos los demás módulos C++.

Plugins de importación de activos

Las herramientas de importación de activos se implementan utilizando una arquitectura basada en plugins. Los plugins incluidos en Qt Quick 3D amplían la funcionalidad de la biblioteca y herramienta de importación de activos, Balsam.

  • Assimp: este complemento utiliza la biblioteca de terceros libAssimp para convertir activos 3D en formatos de intercambio 3D en componentes QML de Qt Quick 3D.

¿Cómo encaja Qt Quick 3D en la pila gráfica de Qt?

Diagrama de arquitectura de la pila de gráficos <span translate=Qt Quick 3D" src="images/quick3d-graphics-stack.drawio.svg" title="Diagrama de arquitectura de la pila de gráficos Qt Quick 3D"/>

El diagrama anterior ilustra cómo Qt Quick 3D encaja en la pila de gráficos Qt. Qt Quick 3D funciona como una extensión de la API 2D Qt Quick, y cuando se utilizan elementos de escena 3D junto con View3D la escena se renderizará a través de la Interfaz de Hardware de Renderizado Qt (RHI). La RHI traducirá las llamadas a la API en las llamadas correctas a la API de hardware de renderizado nativo para una plataforma determinada. El diagrama anterior muestra las opciones disponibles para cada plataforma. Si no se define explícitamente ningún backend nativo, Qt Quick utilizará por defecto un backend nativo de renderizado adecuado para cada plataforma.

La integración entre los componentes 3D de la pila Qt Quick y la pila Qt Quick se describe a continuación en las siguientes secciones.

Integración de 3D en 2D

La visualización de contenidos 3D en 2D es el objetivo principal de la API 3D Qt Quick. La interfaz principal para integrar contenido 3D en 2D es el componente View3D.

El componente View3D funciona como cualquier otra clase derivada de QQuickItem con contenido e implementa la función virtual QQuickItem::updatePaintNode. Qt Quick llama a updatePaintNode para todos los elementos "sucios" del scenegraph Qt Quick durante la fase de sincronización. Esto incluye los elementos 3D gestionados por un View3D, que también experimentan su fase de sincronización como resultado de la llamada updatePaintNode.

El método updatePaintNode de View3D realiza las siguientes acciones:

  • Configurar un renderizador y un objetivo de renderizado si aún no existen.
  • Sincronizar elementos en la escena 3D a través de SceneManager
  • Actualizar cualquier textura "dinámica" que haya sido renderizada por Qt Quick (2D en 3D Texture path más abajo)

El renderizado de la escena 3D, sin embargo, no ocurre en el método View3D updatePaintNode. En su lugar, updatePaintNode devuelve una subclase de QSGNode que contiene el renderizador para Qt Quick 3D, que renderizará la escena 3D durante la fase de preprocesamiento del proceso de renderizado de Qt Quick.

La forma en que se renderizará Qt Quick 3D depende de qué View3D::renderMode se utilice:

Fuera de pantalla

El modo por defecto para View3D es Offscreen. Cuando se utiliza el modo offscreen View3D se convierte en un proveedor de texturas creando una superficie offscreen y renderizando en ella. Esta superficie puede mapearse como una textura en Qt Quick y renderizarse con QSGSimpleTextureNode.

Este patrón es muy similar al funcionamiento de QSGLayerNodes en Qt Quick.

Subyacente

Cuando se utiliza el modo Underlay la escena 3D se renderiza directamente en el QQuickWindow que contiene el View3D. El renderizado se produce como resultado de la señal QQuickWindow::beforeRenderPassRecording() lo que significa que todo lo demás en Qt Quick se renderizará encima del contenido 3D.

Superposición

Cuando se utiliza el modo Overlay, la escena 3D se renderiza directamente en QQuickWindow, que contiene View3D. La renderización se produce como resultado de la señal QQuickWindow::afterRenderPassRecording(), lo que significa que el contenido 3D se renderizará sobre el resto del contenido de Qt Quick.

En línea

El modo de renderizado Inline utiliza QSGRenderNode, que permite el renderizado directo en Qt Quick's render target sin utilizar una superficie fuera de la pantalla. Esto se consigue inyectando los comandos de renderizado en línea durante el renderizado 2D de la escena Qt Quick.

Este modo puede ser problemático porque utiliza el mismo buffer de profundidad que el renderizador de Qt Quick, y los valores z significan cosas completamente diferentes en Qt Quick vs Qt Quick 3D.

Integración de 2D en 3D

Cuando se renderiza una escena 3D, hay muchos escenarios en los que es necesario integrar elementos 2D en 3D. Hay dos formas diferentes de integrar contenido 2D dentro de escenas 3D, cada una de las cuales tiene su propio camino para llegar a la pantalla.

Ruta directa

La ruta directa se utiliza para renderizar contenido 2D Qt Quick como si existiera como un elemento plano en la escena 3D. Por ejemplo, considere la siguiente definición de escena:

Node {
    Text {
        text: "Hello world!"
    }
}

Lo que sucede aquí es: cuando se establece un componente hijo en un nodo espacial de tipo QQuickItem, primero es envuelto por un QQuick3DItem2D, que es sólo un contenedor que añade coordenadas 3D a un ítem 2D. Esto establece la transformación 3D base para el renderizado de todos los hijos 2D posteriores, de forma que aparezcan correctamente en la escena 3D.

Cuando llega el momento de renderizar la escena, los QSGNodes de estos ítems 2D se pasan a Qt Quick Renderer para generar los comandos de renderizado apropiados. Como los comandos se realizan en línea y tienen en cuenta la transformación 3D actual, se renderizan exactamente igual que en el renderizador 2D, pero se muestran como si estuvieran renderizados en 3D.

El inconveniente de este enfoque es que no se puede utilizar ninguna información de iluminación de la escena 3D para sombrear el contenido 2D, porque el renderizador 2D de Qt Quick no tiene ningún concepto de iluminación.

Trayectoria de la textura

La ruta de textura utiliza una escena 2D Qt Quick para crear contenido de textura dinámico. Considere la siguiente definición de Textura:

Texture {
    sourceItem: Item {
        width: 256
        height: 256
        Text {
            anchors.centerIn: parent
            text: "Hello World!"
        }
    }
}

Este enfoque funciona de la misma manera que los elementos de capa en Qt Quick, en que todo se renderiza en una superficie fuera de la pantalla del tamaño del elemento de nivel superior, y esa superficie fuera de la pantalla se puede utilizar como una textura que se puede reutilizar en otros lugares.

Esta textura puede ser utilizada por los materiales de la escena para renderizar el contenido de Qt Quick en los elementos.

Sincronización de escenas

Gestor de escenas

El gestor de escena en Qt Quick 3D es responsable de realizar un seguimiento de los elementos espaciales en una escena 3D, y de asegurarse de que los elementos están actualizando sus correspondientes nodos del gráfico de escena durante la fase de sincronización. En Qt Quick, esta función la desempeña QQuickWindow para el caso 2D. El gestor de escena es la interfaz principal entre los nodos frontales y los objetos del grafo de escena del backend.

Cada elemento de View3D tendrá al menos un gestor de escena, ya que se crea uno y se asocia con la raíz de escena incorporada en la construcción. Cuando se añaden nodos espaciales como hijos de View3D, se registran con el gestor de escenas de View3D. Cuando se utiliza una escena importada, se crea un segundo SceneManager (o se hace referencia a él si ya existe) para gestionar los nodos que no son hijos directos de View3D. Esto es necesario porque, a diferencia de View3D, una escena importada no existe en QQuickWindow hasta que se hace referencia a ella. El SceneManager adicional se asegura de que los activos que pertenecen a la escena importada se creen al menos una vez por cada QQuickWindow en el que son referenciados.

Aunque el gestor de escenas es una API interna, es importante saber que el gestor de escenas es responsable de llamar a updateSpatialNode en todos los objetos que se han marcado como sucios llamando al método update().

Sincronización Frontend/Backend

El objetivo de la sincronización es asegurarse de que los estados establecidos en el frontend (Qt Quick) coinciden con los establecidos en el backend (Qt Quick Spatial Scene Graph Renderer). Por defecto, el frontend y el backend viven en hilos separados: el frontend en el hilo principal de Qt, y el backend en el hilo de renderizado de Qt Quick. La fase de sincronización es donde el hilo principal y el hilo de renderizado pueden intercambiar datos de forma segura. Durante esta fase, el gestor de escena llamará a updateSpatialNode para cada nodo sucio de la escena. Esto creará un nuevo nodo backend o actualizará uno existente para su uso por el renderizador.

Qt Quick Gráfico de escena espacial

Qt Quick 3D está diseñado para utilizar el mismo patrón de separación frontend/backend que Qt Quick: los objetos frontend están controlados por el motor Qt Quick, mientras que los objetos backend contienen datos de estado para renderizar la escena. Los objetos frontales heredan de QObject y están expuestos al motor Qt Quick. Los elementos de los archivos fuente QML se asignan directamente a los objetos frontales.

A medida que se actualizan las propiedades de estos objetos frontales, se crean uno o más nodos backend y se colocan en un gráfico de escena. Dado que el renderizado de escenas 3D implica mucho más estado que el renderizado 2D, existe un conjunto separado de nodos de gráfico de escena especializados para representar el estado de los objetos de la escena 3D. Este gráfico de escena se conoce como Qt Quick Spatial Scene Graph.

Tanto los objetos frontend como los nodos backend pueden clasificarse en dos clases. Los primeros son espaciales, en el sentido de que existen en algún lugar del espacio tridimensional. Lo que esto significa en la práctica es que cada uno de estos tipos contiene una matriz de transformación. En el caso de los elementos espaciales, la relación padre-hijo es importante, ya que cada elemento hijo hereda la transformación de sus padres.

La otra clase de elementos son los recursos. Los elementos de recursos no tienen una posición en el espacio 3D, sino que son simplemente estados que son utilizados por otros elementos. Puede haber una relación padre-hijo entre estos elementos, pero no tiene otro significado que la propiedad.

A diferencia del grafo de escena 2D de Qt Quick, el grafo de escena espacial expone los nodos de recursos directamente al usuario. Así, por ejemplo, en Qt Quick, mientras que QSGTexture es una API pública, no existe QQuickItem que exponga este objeto directamente. En su lugar, el usuario debe utilizar un elemento Image, que describe tanto de dónde procede la textura como la forma de renderizarla, o escribir código C++ para operar en el propio QSGTexture. En Qt Quick 3D estos recursos se exponen directamente en la API QML. Esto es necesario porque los recursos son una parte importante del estado de la escena. Estos recursos pueden ser referenciados por muchos objetos en la escena: por ejemplo, muchos Materiales pueden usar la misma Textura. También es posible definir las propiedades de una textura en tiempo de ejecución para cambiar directamente, por ejemplo, el muestreo de una textura.

Objetos espaciales

Todos los Objetos espaciales son subclases del componente Nodo, que contiene las propiedades que definen la posición, rotación y escala en el espacio 3D.

Objetos de recursos

Los objetos Resource son subclases del componente Object3D. Object3D es sólo una subclase de QObject con algunos ayudantes especiales para su uso con el gestor de escenas. Los objetos recurso tienen asociaciones padre/hijo, pero éstas son útiles sobre todo para la propiedad de los recursos.

Vista3D y capas de renderizado

Con respecto a la separación frontend/backend, View3D es el punto de separación desde la perspectiva del usuario porque un View3D es lo que define qué contenido de la escena se va a renderizar. En Qt Quick Spatial Scene Graph, el nodo raíz de una escena que será renderizada es un nodo Layer. Los nodos Layer son creados por View3D usando una combinación de las propiedades de View3D y las propiedades de SceneEnvironment. Cuando se renderiza una escena para View3D, es este nodo Layer el que se pasa al renderizador para renderizar una escena.

Renderizado de escenas

Diagrama de flujo del gráfico de renderizado de Qt Quick 3D

Configurar el objetivo de renderizado

El primer paso en el proceso de renderizado es determinar y configurar el objetivo de renderizado de la escena. Dependiendo de las propiedades configuradas en SceneEnvironment, el objetivo de render variará. La primera decisión es si el contenido se renderiza directamente a una superficie de la ventana, o a una textura fuera de la pantalla. Por defecto, View3D renderizará en una textura fuera de pantalla. Cuando se utilizan efectos de postprocesado, es obligatorio renderizar a una textura fuera de pantalla.

Una vez determinado el objetivo de renderizado de la escena, se establecen algunos estados globales.

  • tamaño de la ventana - si se renderiza en una ventana
  • viewport - el tamaño del área de la escena que se está renderizando
  • scissor rect - el subconjunto de una ventana al que se debe recortar la ventana gráfica
  • clear color - con qué color borrar el objetivo de renderizado, si lo hay.

Preparar el renderizado

La siguiente fase del renderizado es la fase de preparación, en la que el renderizador se encarga de averiguar qué debe renderizarse en un fotograma determinado y que todos los recursos necesarios están disponibles y actualizados.

La etapa de preparación en sí tiene dos fases: la preparación de alto nivel para determinar qué se va a renderizar y qué recursos se necesitan; y la preparación de bajo nivel que utiliza RHI para configurar los conductos y buffers de renderizado, así como para configurar las dependencias de renderizado del pase de escena principal.

Preparación del renderizado de alto nivel

El propósito de esta fase es extraer el estado del gráfico espacial de la escena y convertirlo en algo que pueda utilizarse para crear comandos de renderizado. La idea general aquí es que el renderizador está creando listas de combinaciones de geometría y materiales para renderizar desde la perspectiva de una única cámara con un conjunto de estados de iluminación.

Lo primero que se hace es determinar el estado global común para todo el contenido. Si el SceneEnvironment define un lightProbe, entonces comprueba si el mapa de entorno asociado a esa textura de sonda de luz está cargado, y si no lo está, se carga o se genera un nuevo mapa de entorno. La generación de un entorno será en sí misma un conjunto de pases para convolucionar la textura fuente en un mapa cúbico. Este mapa cúbico contendrá tanto la información de reflexión especular como la irradiancia, que se utiliza para el sombreado del material.

A continuación, el renderizador debe determinar qué cámara de la escena debe utilizar. Si no se define explícitamente una cámara activa en View3D, se utilizará la primera cámara disponible en la escena. Si no hay cámaras en la escena, entonces no se renderiza ningún contenido y el renderizador abandona.

Con una cámara determinada, es posible calcular la matriz de proyección para este fotograma. El cálculo se realiza en este punto porque cada renderizable necesita saber cómo ser proyectado. Esto también significa que ahora es posible calcular qué elementos renderizables deben ser renderizados. Comenzando con la lista de todos los elementos renderizables, eliminamos todos los elementos que no son visibles porque están desactivados o son completamente transparentes. A continuación, si la cámara activa tiene activada la selección de frustum, se comprueba cada elemento renderizable para ver si está completamente fuera de la vista del frustum de la cámara y, en ese caso, se elimina de la lista de elementos renderizables.

Además de la proyección de la cámara, también se calcula la dirección de la cámara, ya que es necesaria para los cálculos de iluminación en el código de sombreado.

Si existen nodos de luz en la escena, éstos se reúnen en una lista de la longitud del máximo de luces disponibles. Si existen más nodos de luz en la escena que la cantidad de luces que admite el renderizador, cualquier nodo de luz adicional por encima de ese límite se ignora y no contribuye a la iluminación de la escena. Es posible especificar el alcance de los nodos de luz, pero ten en cuenta que incluso cuando se establece un alcance el estado de iluminación de cada luz se sigue enviando a todos los materiales que tienen iluminación, pero para las luces que no están en el alcance el brillo se establecerá en 0, por lo que en la práctica esas luces no contribuirán a la iluminación de esos materiales.

Ahora con una lista más corta de renderizables, cada uno de estos elementos necesita ser actualizado para reflejar el estado actual de la escena. Para cada renderizable comprobamos que se ha cargado un material adecuado, y si no se crea uno nuevo. Un material es una combinación de shaders y un pipeline de renderizado, y es necesario para crear una llamada a dibujo. Además el renderizador se asegura de que cualquier recurso necesario para renderizar un renderizable está cargado, por ejemplo la geometría y las texturas establecidas en el Modelo. Los recursos que no están ya cargados se cargan aquí.

Ver Almacenamiento en disco de shaders para una discusión sobre el almacenamiento en disco de shaders para materiales y efectos.

La lista de renderizables se ordena en 3 listas.

  • Elementos opacos: se ordenan de delante hacia atrás, o en otras palabras, de los elementos que están más cerca de la cámara a los elementos que están más lejos de la cámara. Esto se hace para aprovechar las ventajas del hardware occlusion culling o detección temprana de z en el fragment shader.
  • Elementos 2D: se trata de elementos de QtQuick renderizados por el renderizador de Qt Quick.
  • Elementos transparentes: se ordenan de atrás hacia delante, o en otras palabras, de los elementos que están más lejos de la cámara a los que están más cerca de la cámara. Esto se hace porque los elementos transparentes necesitan ser mezclados con todos los elementos que están detrás de ellos.

Preparación del render a bajo nivel

Ahora que todo lo que hay que tener en cuenta para este fotograma se ha determinado, la fontanería y las dependencias para el pase de render principal se pueden abordar. Lo primero que se hace en esta fase es renderizar cualquier prepase que se requiera para el pase principal.

  • Render DepthPass - Ciertas características como Screen Space Ambient Occlusion y Shadowing requieren un depth pre-pass. Este pase consiste en renderizar todos los elementos opacos a una textura de profundidad.
  • Render SSAOPass - El objetivo del pase Screen Space Ambient Occlusion es generar una textura de oclusión ambiental. Esta textura es utilizada posteriormente por los materiales para oscurecer ciertas áreas al sombrear.
  • Render ShadowPasses - Cada luz en la escena que tiene sombra habilitada, contribuye a un pase de sombra adicional. Hay dos técnicas de sombreado diferentes empleadas por el renderizador, por lo que dependiendo de los tipos de luz habrá diferentes pases. Cuando se renderizan las sombras de una luz direccional, la escena se renderiza en una textura de oclusión 2D a partir de una combinación de la dirección de la luz direccional y el tamaño de la circunferencia de la cámara. Cuando se renderizan sombras de una luz puntual o puntual, la textura de oclusión de la luz es un mapa cúbico que representa la contribución de oclusión relativa a cada dirección de la cara de la luz.
  • RenderizarTexturaDePantalla - Este pase sólo se producirá cuando se utilice un CustomMaterial que requiera una textura de pantalla, que puede utilizarse para técnicas de renderizado como la refracción. Este pase funciona como un pase de profundidad, pero en su lugar renderiza todos los elementos opacos a una textura de color.

Una vez que se han renderizado las dependencias, el resto de pases se preparan pero no se renderizan. Esta preparación implica tomar el estado recopilado en la etapa de preparación de alto nivel y traducirlo a primitivas gráficas como la creación/actualización de valores de búferes uniformes, la asociación de muestreadores con texturas dependientes, la configuración para la vinculación de recursos de sombreado y todo lo que implica la creación de un estado de canalización necesario para realizar una llamada de dibujo.

Renderizado de escenas

Ahora que el trabajo duro de preparación está hecho, la parte fácil es ejecutar los comandos que contribuyen al contenido de la escena principal. El renderizado funciona en este orden:

  • Clear Pass - Esto no es realmente un pase, pero dependiendo de lo que backgroundMode se establece en SceneEnvironment, diferentes cosas pueden suceder aquí. Si el modo de fondo es transparente o de color, entonces el búfer de color se borrará con la transparencia o el color especificado. Si, por el contrario, el modo de fondo se establece en SkyBox, entonces se ejecutará un pase que renderiza el SkyBox desde la perspectiva de la cámara, que también llenará el búfer con los datos iniciales.
  • Pase opaco - A continuación se dibujarán todos los elementos opacos. Esto sólo implica establecer el estado de la tubería, y ejecutar el comando de dibujo para cada elemento en el orden de la lista, ya que ya están ordenados en este punto.
  • Pase 2D - Si hay algún elemento 2D en la escena, entonces se invoca al renderizador Qt Quick para generar los comandos de render necesarios para renderizar esos elementos.
  • Pase transparente - Finalmente, los elementos transparentes de la escena se renderizan uno a uno de la misma manera que los elementos opacos.

Con esto concluye el renderizado de la escena.

Post-procesamiento

Si cualquier funcionalidad de post-procesamiento está habilitada, entonces se puede asumir que el resultado del renderizador de la escena fue una textura que es una entrada para la fase de post-procesamiento. Todos los métodos de post-procesado son pases adicionales que operan sobre esta textura de entrada de la escena.

Todos los pasos de la fase de post-procesado son opcionales, y si no se activan las funciones incorporadas ni los efectos definidos por el usuario, el resultado del renderizador de escena es lo que utiliza el objetivo final de renderizado. Tenga en cuenta, sin embargo, que tonemapping está activado por defecto.

Gráfico de pases de renderizado postprocesado

Post-procesamiento incorporado

ExtendedSceneEnvironment y su tipo padre SceneEnvironment ofrecen los efectos más comunes utilizados en escenas 3D, así como el mapeado de tonos que se utiliza para mapear los valores de color de alto rango dinámico generados por el renderizador al rango 0-1 LDR. Los efectos incluyen profundidad de campo, brillo/floración, destello de lente, viñeta, ajuste y gradación de color, niebla y oclusión ambiental.

Efectos de postprocesado

Las aplicaciones pueden especificar sus propios efectos de post-procesamiento personalizados como una lista ordenada en la propiedad SceneEnvironment::effects. Cuando esta lista no está vacía, los efectos que contiene se aplican antes que los efectos incorporados proporcionados por ExtendedSceneEnvironment. Cada efecto de postprocesamiento forma parte de una cadena en la que la salida del efecto anterior es la entrada del siguiente. El primer efecto de esta cadena obtiene su entrada directamente de la salida del paso del renderizador de escenas. También es posible que los efectos accedan a la salida de la textura de profundidad del renderizador de escenas.

Cada efecto en este proceso puede consistir en múltiples subpasos, lo que significa que es posible renderizar contenido en buffers intermedios. Se espera que la última pasada de un efecto multipase genere una única textura que contenga los datos de color que se utilizarán en los siguientes pasos de la fase de postprocesamiento.

Antialiasing temporal y progresivo

Los pasos de antialiasing Temporal y Progresivo se activan opcionalmente estableciendo propiedades en SceneEnvironment. Aunque no forman parte estrictamente de la fase de postprocesado, los resultados reales del antialiasing Temporal y Progresivo se realizan durante la fase de postprocesado.

El Antialiasing Temporal se realiza cuando una escena se está actualizando activamente. Cuando está activado, la cámara activa realiza ajustes muy pequeños en la dirección de la cámara para cada fotograma mientras dibuja la escena. El fotograma actual se mezcla con el fotograma renderizado previamente para suavizar lo que se ha renderizado.

El Antialiasing Progresivo sólo se realiza cuando no se está actualizando una escena. Cuando se activa, se fuerza una actualización y se renderiza el estado actual de la escena con ajustes muy pequeños en la dirección de las cámaras activas. Se acumulan hasta 8 fotogramas y se mezclan con pesos predefinidos. Esto tiene el efecto de suavizar una escena no animada, pero tiene un coste de rendimiento porque se renderizarán varios fotogramas extra para cada actualización.

Super Sampling Antialiasing (SSAA)

El Super Sampling Antialiasing es un método de fuerza bruta para suavizar una escena. Funciona renderizando a una textura que es un múltiplo del tamaño solicitado de la escena, y después reduciendo el muestreo al tamaño objetivo. Así, por ejemplo, si se solicita 2X SSAA, la escena se renderizará con una textura que sea 2 veces el tamaño deseado y, a continuación, se reducirá su tamaño como parte de esta fase. Esto puede tener un gran impacto en el rendimiento y el uso de recursos, por lo que debe evitarse si es posible. También es posible que el tamaño de View3D sea demasiado grande para utilizar este método, ya que la textura necesaria para este método puede ser mayor de lo que admite el hardware de renderizado.

© 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.