私は私の質問でそれほど明確ではなかったことを認めなければなりません。とにかく、私は問題を改善し、ここでそれに対する解決策を提示します。
私にはさまざまな種類の任意の形状があり(ユーザーは必要な数だけ作成して狂ったように変形させることができます)、画面上のピクセルの色からユーザーが選択した形状の数を検出する方法を開発したいと思います。 (ユーザーはそのピクセルに触れたばかりです)。
そこで、ある種のカラーIDを使用して形状を色分けします。私はバイナリレベルで作業しています。画面の最初の図形の色IDは00000001で、2番目の図形のIDは00000010というように続きます。したがって、1バイト(たとえば、赤のチャネル)を使用して、最大8つの異なるカラーIDを格納できます。RGBA8888形式を使用する場合、図形の最大数は32です。
私が最初に開発したアルゴリズムは、ソースカラーIDとデスティネーションカラーIDをglBlendFunc(GL_ONE、GL_ONE)でブレンドすることで、すべてが正常に機能しているように見えました。したがって、色000010101のタッチされたピクセルの場合、1番目、3番目、および5番目の形状がタッチされたことを意味します。ただし、ユーザーが作成できる非凸形状がいくつかあります(これが折り畳み形状の正しい言葉である場合)。この場合、カラーID 00000001の図形がユーザーによって折りたたまれていると、重複するピクセルはID 00000010になります。これは、図形が最初にフレームバッファーに描画されたときに00000001を書き込み、次に同じ形状の重複するピクセルがさらに00000001を追加するためです。ブレンディングに。
したがって、フレームバッファに書き込まれたカラーID間で何らかの方法でBITWISE OR(最初に質問で述べたように論理的ではない)を実行できれば、問題は解決されます。実際、これは、glLogicOp(GL_OR)関数を使用したOpenGLES1.1の場合です。残念ながら、これはOpenGL ES 2.0では利用できません。また、シェーダーを1つ、パスをもう1つ作成する必要がありますが、これはやり過ぎで保守が難しいと思います。
OpenGLES2.0のソリューションは次のとおりです。
- RenderTexture Bの色をglClearColor(0,0,0,0)にクリアします
- 形状ごとに
- Rendertexture Aの色をglClearColor(0,0,0,0)にクリアします
- カラーIDをカラーとして書き込むフラグメントシェーダーを使用して、RendertextureAにシェイプを描画します。
- GL_ONE、GL_ONERendertextureAとRendertextureBのコンテンツをブレンドします
- 終了
- RenderTexture Bには、必要なすべての情報があります。
- ユーザーが画面に触れたら、glReadPixelを使用してRenderTexture Bから対応するピクセルをサンプリングし、バイナリコードから触れた形状を見つけます。
一番