OpenGL: come eseguire il blitting RGBA- > RGBA senza cambiare l'alfa di destinazione

StackOverflow https://stackoverflow.com/questions/146140

  •  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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top