Creo que hay dos posibles problemas aquí.
Recuerde que todas las líneas de superposición se mezclan dos veces aquí. Una vez cuando se combinan en la textura FBO, y de nuevo cuando la textura FBO se mezcla sobre la escena.
Por lo tanto, la primera posibilidad es que no tenga habilitada la fusión al trazar una línea sobre otra en la superposición FBO. Cuando dibuja en una superficie RGBA con mezcla, la alfa actual simplemente se escribe directamente en el canal alfa de la superposición FBO. Luego, más tarde, cuando fusionas toda la textura FBO sobre la escena, ese alfa hace que tus líneas sean translúcidas. Entonces, si tiene una combinación contra "el mundo" pero no entre los elementos de superposición, es posible que no se esté produciendo una fusión.
Otro problema relacionado: cuando mezcla una línea sobre otra en el modo de mezcla "estándar" (alfa src, alfa 1-src) en el FBO, el canal alfa de la parte "mezclada" contendrá una mezcla de los alfas de los dos elementos de superposición. Esto probablemente no es lo que quieres.
Por ejemplo, si dibuja dos líneas alfa al 50% una encima de la otra en la superposición, para obtener el efecto equivalente cuando bligea el FBO, necesita que el alfa del FBO sea ... 75%. (Es decir, 1 (1 - .5) * (1-0,5), que es lo que pasaría si usted acaba de dibujar dos líneas alfa 50% por encima de su escena, pero cuando se dibuja las dos líneas de 50%, usted. obtener 50% de alfa en el FBO (una mezcla de 50% con ... 50% .
Esto trae a colación la cuestión final: al premezclar las líneas entre sí antes de mezclarlas en el mundo, está cambiando el orden del sorteoMientras que es posible que haya tenido:
mezcla (mezcla (mezcla (color de fondo, modelo), primera línea), segunda línea);
ahora tendrá
mezcla (mezcla (primera línea, segunda línea), la mezcla (color de fondo, el modelo)).
En otras palabras, la mezcla previa de las líneas de superposición en un FBO cambia el orden de fusión y, por lo tanto, cambia el aspecto final de una manera que quizás no desee.
En primer lugar, la forma más simple de evitar esto: no use un FBO. Me doy cuenta de que este es un tipo de respuesta de "diseña tu aplicación", pero usar un FBO no es lo más barato, y las tarjetas GL modernas son muy buenas para dibujar líneas. Entonces, una opción sería: en lugar de combinar líneas en un FBO, escriba la geometría de línea en un objeto de búfer de vértice (VBO). Simplemente extienda un poco la VBO cada vez. Si dibuja menos de, digamos, 40,000 líneas a la vez, es casi seguro que sea tan rápido como lo que estaba haciendo antes.
(Un consejo si usted va esta ruta: utilizar glBufferSubData para escribir las líneas, no glMapBuffer - mapeo puede ser costoso y no trabajar en sub-intervalos de muchos conductores ... mejor simplemente dejar que el conductor de copia los pocos vértices nuevos)
Si eso no es una opción (por ejemplo, si dibuja una mezcla de tipos de formas o usa una mezcla de estado GL, tal que "recordar" lo que hizo es mucho más complejo que simplemente la acumulación de vértices), entonces es posible que desee cambiar la forma en que dibuja en la VBO.
Básicamente lo que tendrá que hacer es habilitar la mezcla por separado; inicialice la superposición a negro + 0% alfa (0,0,0,0) y mezcle por "mezcla estándar" el RGB pero mezcla aditiva de los canales alfa. Esto todavía no es del todo correcto para el canal alfa, pero generalmente está mucho más cerca; sin esto, las áreas sobreexpuestas serán demasiado transparentes.
Luego, al dibujar el FBO, use alfa "pre-multiplicada", es decir, (uno, menos-src-alph).
He aquí por qué es necesario el último paso: cuando dibuja en el FBO, ya ha multiplicado cada llamada de sorteo por su canal alfa (si la fusión está activada). Como dibuja sobre negro, una línea verde (0,1,0,0,5) ahora es de color verde oscuro (0,0,5,0,0.5). Si alfa está activado y se mezcla normalmente de nuevo, el alfa se vuelve a aplicar y tendrá 0,0,25,0,0.5). Simplemente usando el color FBO como está, evitas la segunda multiplicación alfa.
Esto a veces se llama alpha "pre-multiplicado" porque el alfa ya se ha multiplicado en el color RGB. En este caso, quiere que obtenga los resultados correctos, pero en otros casos, los programadores lo usan para la velocidad. (Al multiplicar previamente, elimina un multímetro por píxel cuando se realiza la fusión op.)
Espero que ayude! Mezclar bien cuando las capas no se mezclan en orden es realmente complicado, y la mezcla por separado no está disponible en el hardware antiguo, por lo que simplemente dibujar las líneas cada vez puede ser la ruta de menor sufrimiento.
blending debería funcionar con lo que está en el framebuffer. (Eso es lo que mezcla _doses_). Proporcione más datos (qué modo de fusión está utilizando, ¿cómo llama a la mezcla "no correctamente"? – Bahbar
He actualizado con más información. Gracias por su rápida respuesta. – staticfloat