OpenGL: come eseguire il blitting RGBA- > RGBA senza cambiare l'alfa di destinazione
-
02-07-2019 - |
Domanda
Ho una trama OpenGL RGBA e vi aggiungo un'altra trama RGBA usando un oggetto framebuffer. Il problema è che se uso le solite funzioni di fusione con
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),
il blit risultante fa sì che l'alfa della trama di destinazione cambi, rendendolo leggermente trasparente per i luoghi in cui l'alfa era in precedenza 1. Vorrei che l'alfa della superficie di destinazione non cambiasse mai, ma altrimenti l'effetto sui valori RGB dovrebbe essere esattamente come con GL_SRC_ALPHA
e GL_ONE_MINUS_SRC_ALPHA
. Quindi le funzioni del fattore di fusione dovrebbero essere (As, As, As, 0) e (1-As, 1-As, 1-As, 1). Come posso farlo?
Soluzione
È possibile impostare le modalità di fusione per RGB e alfa su equazioni diverse:
void glBlendFuncSeparate(
GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha);
Nel tuo caso vuoi usare i seguenti enum:
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
Nota che potresti dover importare la funzione glBlendFuncSeparate come estensione. È sicuro farlo però. La funzione è attiva da molto tempo. Fa parte di OpenGL 1.4
Un altro modo di fare lo stesso è disabilitare la scrittura sul canale alfa usando glColorMask:
void glColorMask( GLboolean red,
GLboolean green,
GLboolean blue,
GLboolean alpha )
potrebbe essere molto più lento di glBlendFuncSeparate perché i driver OpenGL ottimizzano le funzioni più comunemente utilizzate e glColorMask è una delle funzioni OpenGL utilizzate raramente.
Se sei sfortunato potresti persino finire con l'emulazione di rendering del software chiamando le funzioni di oddball :-)
Altri suggerimenti
Forse potresti usare glColorMask ()? Ti consente di abilitare / disabilitare la scrittura su ciascuno dei quattro componenti del colore.