UIViewとEAGLViewをブレンドするにはどうすればよいですか?
質問
EAGLViewレイヤーでレンダリングするopenglシーンと、UIView(EAGLViewの兄弟で、その上に位置する)でレンダリングする他の要素(円など)があります。 2つのレイヤー間で色をブレンドすることはできますか? EAGLViewから色の反転効果を得るために、いくつかの差分ブレンディングを行いたいです。
私はCGBlendModeをいじくり回してきましたが、現在のビューで描画しているものにしか影響しないようです。これはCGContextと関係があると思いますが、詳細については少し曖昧です。UIViewとEAGLViewに同じCGContextを強制して、それらの間でブレンドが機能するようにできますか?
ヘルプ、修正、説明を歓迎します。前もって感謝します、 -S
解決
簡単な答えはできません。長い答えが続きます。
EAGLView
とは、XcodeのOpenGL ESテンプレートに含まれている UIView
のサブクラスを意味する必要があります。このクラスを特別なものにしているのは、 layerClass
クラスメソッドがオーバーライドされ、デフォルトの CALayer
クラスの代わりに CAEAGLLayer
クラスを返すことです。
UIView
と CALayer
はペアで機能します。すべての UIView
オブジェクトは CALayer
によってサポートされ、 CALayer
はレイアウトと画面へのレンダリングを担当するオブジェクトです。 UIView
は、 CALayer
のデリゲートであり、必要に応じてグラフィックを描画します。
CALayer
は、デリゲート( UIView
)を CGContextRef
に描画させます。 UIView
ごとに1つのコンテキストであるため、1つのUIViewコンテキスト内でのみ機能するため、 CGBlendMode
を使用して複数のビューをブレンドすることはできません。
CALayer
のブレンドは、フィルタープロパティを使用して行う必要があります。これらはiPhone OS用に定義されていますが、使用可能なフィルターはドキュメントに従って未定義です。これは、現時点ではiPhone OSでCore Imageを使用できないためです。
他のヒント
その意味で色をブレンドできるとは思いません。できる最善の方法は、一方が他方を完全に覆い隠すか、最上層を半透明にすることです(この場合、下に部品が表示されます)。しかし、XORタイプの描画はできません。