Come posso fondere tra il mio UIView e il mio EAGLView?
Domanda
Ho un rendering di scena aperto su un livello EAGLView e alcuni altri elementi (cerchi e simili) su un UIView (che è un fratello di EAGLView, posizionato sopra di esso). È possibile fondere i colori tra i due strati? Vorrei fare una certa differenza per ottenere un effetto di inversione sui colori da EAGLView.
Ho giocato con CGBlendMode ma sembra influenzare solo ciò che sto disegnando in quella vista corrente. Penso che questo abbia qualcosa a che fare con CGContext ma sono un po 'confuso sui dettagli, posso forzare UIView ed EAGLView ad avere lo stesso CGContext in modo che la fusione funzioni tra loro?
Aiuto, correzioni, chiarimenti sono tutti apprezzati. Grazie in anticipo, -S
Soluzione
Risposta breve è impossibile. Segue una risposta lunga.
Con EAGLView
devi indicare la sottoclasse di UIView
inclusa nel modello OpenGL ES in Xcode. Ciò che rende speciale questa classe è che il metodo di classe layerClass
viene sovrascritto e restituisce la classe CAEAGLLayer
invece della classe CALayer
, come impostazione predefinita.
UIView
e CALayer
funzionano in coppia. Tutti gli oggetti UIView
sono supportati da un CALayer
, il CALayer
è l'oggetto responsabile del layout e del rendering sullo schermo. Il UIView
è un delegato del CALayer
ed è responsabile del disegno della grafica quando necessario.
CALayer
consentirà al suo delegato (il UIView
) di disegnare in un CGContextRef
. È un contesto per UIView
, quindi non puoi usare CGBlendMode
per fondere più viste poiché funzionerà solo all'interno di un singolo contesto UIView.
La fusione di CALayer
deve essere eseguita utilizzando le proprietà del filtro. Questi sono definiti per il sistema operativo iPhone, ma i filtri disponibili sono indefiniti secondo la documentazione. Questo perché Core Image non è al momento disponibile su iPhone OS.
Altri suggerimenti
Non credo che sarai in grado di fondere i colori in quel senso. Il meglio che puoi fare è avere uno che oscuri completamente l'altro o avere lo strato superiore semitrasparente (nel qual caso vedrai la parte sottostante) - ma non sarai in grado di eseguire il disegno di tipo XOR.