5

ある頂点のテクスチャが別の頂点とマージするときに、次のブレンドを実現しようとしています。

FiftyThree が Paper iPad アプリで描いた画像

これが私が現在持っているものです:

ここに画像の説明を入力

ブレンディングを有効にして、ブレンディング機能を次のように指定しています。

    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

紙のアプリで描かれた画像は、小さな円で構成されており、前後で同じテクスチャと融合し、色とアルファにブレンド効果があることがわかります。

どうすれば目的の効果を達成できますか?

アップデート:

私が考えているのは、2 つのテクスチャの交差領域でアルファ チャネルが変更されている (加算またはその他のカスタム関数のいずれか) 一方で、テクスチャが交差領域に描画されていないということです。領域の残りの部分には、残りのテクスチャが描画されます。そのようです:

ここに画像の説明を入力

ただし、この結果を達成する方法は完全にはわかりません。

4

2 に答える 2

1

このためのブレンドは必要ありません (そして、思い通りに動作しません)。

画面空間でテクスチャ座標を定義している限り、2 つの別々の円の間でシームレスになるはずです。

これを行うには、頂点シェーダーを介して渡されたテクスチャ座標を使用する代わりに、フラグメントの位置を使用してテクスチャをサンプリングし、スケーリングをプラスまたはマイナスします。

float texcoord = gl_FragCoord / vec2(xresolution_in_pixels, yresolution_in_pixels);`
gl_FragColor = glTexture2D(papertexture, texcoord);

GLSL にアクセスできない場合は、代わりにステンシル バッファーを使用して何かを行うことができます。すべての円をステンシル バッファーに描画し、結合された領域をステンシル マスクとして使用してから、テクスチャのフルスクリーン クワッドを描画します。色は、すべての円の結合部分にシームレスに配置されます。

于 2012-07-17T21:33:46.020 に答える
1

この効果は、アルファの最大ブレンディングで実現できます。または、シェーダー (OpenGL ES 2.0) を使用した手動 (ブレンドオフ):

#extension GL_EXT_shader_framebuffer_fetch : require
precision highp float;

uniform sampler2D texture;
uniform vec4      color;

varying vec2 texCoords;

void main() {
    float res_a =gl_LastFragData[0].a;
    float a = texture2D(texture, texCoords).a;
    res_a = max(a, res_a);
    gl_FragColor = vec4(color.rgb * res_a, res_a);
}

結果:

ここに画像の説明を入力

于 2014-07-02T12:23:45.080 に答える