1

タイトルを少し説明させてください。フレームバッファにはいくつかのカラー値があります(簡単にするために、バイナリの1つのカラーチャネルのみを参照します。たとえば、特定のピクセルの00000001を参照します)。次に、その特定の値に新しい値を書き込みます。OpenGLは、入力値とそのピクセルにすでに存在する値を調べ、両方の最大値を維持する必要があります。言い換えると、入力値と既存の値の間でBITWISEORを実行する必要があります。したがって、既存の値が00000001で、着信が00000010の場合、結果は00000011である必要があります。

OpenGL ES 1.1では、これはglLogicOp(http://www.opengl.org/sdk/docs/man/xhtml/glLogicOp.xml)関数を使用して簡単に実現できたと思います。しかし、これはOpenGL ES 2.0ではサポートされていません(なぜ削除されたのですか?? :()。同様の結果を達成できるブレンディング関数は考えられません(ブレンディングでは不可能だと思います)。私の目標を達成するためのステンシルバッファまたは別のトリック?

そのための手順を説明していただけますか?

PSシェーダーを使用してすべてが可能であることは知っていますが、これを実装するには多大な労力が必要になります。それが唯一の解決策である場合は、このアプローチの方向性を教えてください。

前もって感謝します。

4

3 に答える 3

0

そのためにはシェーダーを使用する必要があると思います。

1)swapIndexとのスワッピングに使用される2つのrenderTargets[2]を作成します。

2)1つのrenderTarget [swapIndex]にレンダリングし、GLSLシェーダーでサンプリングする参照テクスチャとして他のrenderTarget[1-swapIndex]を使用します。

3)フラグメント(別名ピクセル)シェーダーで、テクスチャ(別名renderTarget [1-swapIndex])からサンプリングし、「gl_FragColor」をmax(texture、someColor)に設定します。

4)swapIndex {swapIndex = 1-swapIndex;}を反転して、最初からやり直します。

于 2012-01-05T11:51:23.337 に答える
0

私は私の質問でそれほど明確ではなかったことを認めなければなりません。とにかく、私は問題を改善し、ここでそれに対する解決策を提示します。

私にはさまざまな種類の任意の形状があり(ユーザーは必要な数だけ作成して狂ったように変形させることができます)、画面上のピクセルの色からユーザーが選択した形状の数を検出する方法を開発したいと思います。 (ユーザーはそのピクセルに触れたばかりです)。

そこで、ある種のカラー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のソリューションは次のとおりです。

  1. RenderTexture Bの色をglClearColor(0,0,0,0)にクリアします
  2. 形状ごとに
  3. Rendertexture Aの色をglClearColor(0,0,0,0)にクリアします
  4. カラーIDをカラーとして書き込むフラグメントシェーダーを使用して、RendertextureAにシェイプを描画します。
  5. GL_ONE、GL_ONERendertextureAとRendertextureBのコンテンツをブレンドします
  6. 終了
  7. RenderTexture Bには、必要なすべての情報があります。
  8. ユーザーが画面に触れたら、glReadPixelを使用してRenderTexture Bから対応するピクセルをサンプリングし、バイナリコードから触れた形状を見つけます。

一番

于 2012-01-06T09:31:44.423 に答える
0

@Summon、コメントの代わりに回答を追加すると申し訳ありませんが、コメントを残すのに十分な評判がありません。

ともかく:

ポイント1:先月この監視のために約2週間のプログラミングを破棄しなければならなかったので、シェーダーでビット単位または/および/シフトを100%実行できないと確信しています。:) :)

ポイント2:GLSL(セクション演算子)に関するウィキペディアのこの記事を見てください。

バージョン1.30でビット演算子が追加されました。

A.シェーダーに#version130を追加しようとすると、コンパイルされません。B. A&B(単一の&に注意)などのビット演算を追加しようとすると、A | B、A << 2、B >> 2など、コンパイルされません。

さまざまな本/フォーラム/SDKを読んで、同じ確認を見つけました。

私はこの問題に関して私が持っていたのと同じ頭痛を避けたかったのです。

マウリツィオベネデッティ

于 2012-01-06T12:32:04.573 に答える