12

私は OpenGL ES 2.0 を学んでおり、それがどのように機能するかをよりよく理解するためにアプリを作成したいと考えています。アプリには、ユーザーが画像に適用できる一連のフィルターがあります (私は知っていますが、新しいものは何もありません:P)。

このフィルターの 1 つは 2 つの画像と 1 つのマスクを取り、マスクを通してそれらを示す 2 つの画像を混合します (ここでは、取得したいものをよりよく説明するための画像)

ここに画像の説明を入力

現時点では、私は本当に混乱しており、この効果を作成するためにどこから始めればよいかわかりません. 複数のテクスチャと複数の FrameBuffer を使用する必要があるのか​​、それとも 1 つのシェーダーだけで作業できるのかがわかりません。

このプロジェクトを行う際に役立つヒントはありますか?

編集 - - - -

私はこの解決策を見つけましたが、円の代わりにマスク線として使用すると、特に線が回転している場合、結果は本当に「汚れた」ものになります。

precision highp float;

varying vec4 FragColor;
varying highp vec2 TexCoordOut;

uniform sampler2D textureA;
uniform sampler2D textureB;
uniform sampler2D mask;

void main(void){
    vec4 mask_color = texture2D(mask, TexCoordOut);

    if (mask_color.a > 0.0){
        gl_FragColor =  texture2D(textureA, TexCoordOut);
    }else {
        gl_FragColor =  texture2D(textureB, TexCoordOut);
    }
}

Stencil バッファまたはブレンディングのどちらを使用する方がよいのでしょうか?

4

2 に答える 2

19

コストのかかる を使用せずに、1 行でマスクを適用できますif

gl_FragColor = step( 0.5, vMask.r ) * vColor_1 + ( 1.0 - step( 0.5, vMask.r ) ) * vColor_2;

または、2 つの色の間を補間することをお勧めします。

gl_FragColor = mix( vColor_1, vColor_2, vMask.r );

この場合、エイリアシングを少なくするために、マスクを平滑化 (ガウスぼかし) することができます。これにより、単一値のしきい値設定と比較して非常に良い結果が得られます。

于 2013-09-07T18:40:14.787 に答える