2012-01-23 24 views
5

Para aclarar, cuando digo 'framebuffer predeterminado' me refiero al proporcionado por el sistema de ventanas y lo que termina en su monitor.Mezcla FBO en framebuffer predeterminado

Para mejorar mis velocidades de representación para una aplicación CAD, he logrado separar los elementos tridimensionales de los manipulados en Qt en 2D, y ahora cada uno de ellos se traduce en su propio FBO. Cuando llegue el momento de ponerlos en la pantalla, coloco el FBO 3D en el FB predeterminado, y luego quiero mezclar mi 2D FBO encima de él.

He llegado a la parte de corte fino, pero no veo cómo mezclar mi 2D FBO en ella? Ambos FBO son idénticos en tamaño y formato, y son los mismos que el FB predeterminado.

Estoy seguro de que es una operación simple, pero no puedo encontrar nada en la red, presumiblemente me falta el término correcto para lo que estoy tratando de hacer. Aunque estoy usando Qt, puedo usar comandos nativos de OpenGL sin problema.

Respuesta

7

Una operación blit es, en última instancia, una operación de copia de píxeles. Si desea superponer una imagen sobre otra, no puede modificarla. En su lugar, debe representar un cuadrángulo de pantalla completa como una textura y usar el proper blending parameters para su operación de fusión.

+0

Esto sólo parece terriblemente ineficiente sin embargo, tengo dos conjuntos de valores de píxeles (los tampones) de igual tamaño, en última instancia, todo lo que tiene que hacer es aplicar una operación matemática para combinar un elemento de uno de ellos para el elemento correspondiente del otro. ¿OpenGL realmente solo trata las FBO como texturas? – cmannett85

+0

@ cbamber85 representar a la textura no sería tan ineficiente –

+1

@ cbamber85: "¿OpenGL realmente solo trata las FBO como texturas?" Los FBO son solo contenedores para imágenes. Adjuntas imágenes a FBO, pero el FBO no es el propietario. Las imágenes provienen de otros objetos: texturas y renderbuffers. Y por muy "ineficiente" que parezca, renderizar una imagen encima de otra es extremadamente rápido. Ningún vértice se transforma. Nada más que el muestreo de textura en el sombreador de fragmentos. Además, la API no te ofrece otra forma de hacerlo, por lo que es lo más eficiente posible. –

1

Puede usar GL_EXT_framebuffer_blit a blit contenido del objeto framebuffer para el framebuffer de la aplicación (o para cualquier otro). Aunque, como indica la especificación, no es posible usar la mezcla:

La copia de píxeles omite la tubería de fragmentos. Las únicas operaciones de fragmento que afectan a la blit son la prueba de propiedad de píxeles y la prueba de tijera.

Por lo tanto, cualquier combinación significa utilizar el sombreador de fragmentos como se sugiere. Un pase de pantalla completa con mezcla debe ser bastante barato, creo que no hay nada de qué preocuparse.

Cuestiones relacionadas