1

AndroidのOpenGLES2.0で、いくつかの三角形に画像を表示するための簡単な画像ビューアを作成しています。これらの画像には特定の色があり、何らかの方法で黒に置き換える必要があります。問題は、最小フィルターと最大フィルターにGL_LINEARを使用した場合、置き換える必要のある色の輪郭が表示されたままになることです。フィルタにGL_NEARESTを使用すると、シェーダーはそれほど問題なく色を置き換えることができますが、画像をスムーズにレンダリングせず、もちろんズームインおよびズームアウト時にピクセル化されたように見えます。

この種のタスクを実行するためのより良い方法があるのだろうか。私が持っていたいくつかのアイデアは次のとおりです。

  • テクスチャピクセルで1回だけ実行され、フラグメントシェーダーでテクスチャが実際に使用される前に色を置き換える、別のシェーダーを作成しますか?
  • GL_LINEARが使用されている場合でも機能するように、シェーダーを書き直します。

誰かが私にこれが通常どのように行われるかについての手がかりを与えることができますか?シェーダーでこの操作を実行したい理由は、マスクのピクセルカラーが常に黒のままであることを確認できるようにするためです。

私はOpenGLES2.0にまったく慣れていませんが、物事がどのように機能するかを学ぼうとしています。それを心に留めて、私が学ぶのを手伝ってください。前もって感謝します。

4

1 に答える 1

1

その場合(マスクは常に同じ場所)、より多くのオプションがあると思います。

マスク領域が 1 で、マスクされていない領域が 0 の単一チャネル イメージを作成します。

次に、シェーダーで元のテクスチャとマスク テクスチャをサンプリングし、マスク値が特定のしきい値よりも大きい場合は、マスクされた色を独自の色に置き換えることができます。

これにより、ピクセルを拒否する値を調整できるため、GL_LINEAR を使用する際の問題が多少軽減されます。

たとえば、マスクされたピクセルとマスクされていないピクセルの間でサンプリングすると、マスク値は 0.5 になり、色は (0.5*color_key + 0.5*unmasked_color) になります。この許容できない色のにじみが見つかった場合は、アルファ リジェクトを 0.1、0.001 などに設定して、マスクの跡がわずかでもあるピクセルをマスクすることができます。これにより、マスクされた領域がわずかに拡大されますが、結果のどこにもカラー キーの痕跡が見えなくなります。

于 2012-05-31T02:49:03.190 に答える