2011-10-20 6 views
1

私は、OpenGL-ESを使って2つのテクスチャをブレンドするアプリケーションに取り組んでいます。オーバーレイ画像では、アルファチャンネルとして特定の色を指定したいとします(例:緑色)。どのようにこれを達成することができますか?私はglBlendFuncを大いに成功させずに使ってみました。どんな助けでも大歓迎です!sampler2Dテクスチャのアルファチャンネルの色を設定する方法はありますか?

答えて

0

そこのOpenGL自体にそのような機能はありませんが、多分あなたはシェーダでそれを達成できます。

uniform vec3 colorMask; // eg. green 

varying vec2 texCoord; 
uniform sampler2D overlay; 

void main() 
{ 
    vec4 texture = texture2D(overlay, texCoord); 
    // get RGB of the texture 

    vec3 absdiff = abs(texture.rgb - colorMask); 
    float alpha = all(lessThan(absdiff, vec3(0.1)))? 1.0 : 0.0; 
    // calculate alpha using vector relational functions 

    texture.a = alpha; // use alpha 

    gl_FragColor = texture; 
    // write final color, can use blending 
} 

これは、テクスチャの色の絶対差を計算し、色をマスキングし、0.1と比較することで動作します。それはかなりシンプルですが、遅いかもしれません(私はメモリからそれを書いています、あなたはそれをテストする必要があります)。

それとも、アルファを計算する別の方法を使用することができます。これは、アルファを計算する二乗誤差メトリックを使用している

uniform vec3 colorMask; // eg. green 

varying vec2 texCoord; 
uniform sampler2D overlay; 

void main() 
{ 
    vec4 texture = texture2D(overlay, texCoord); 
    // get RGB of the texture 

    vec3 diff = texture.rgb - colorMask; 
    float alpha = step(dot(diff, diff), 0.1); 
    // calculate alpha using difference squared and a step function 

    texture.a = alpha; // use alpha 

    gl_FragColor = texture; 
    // write final color, can use blending 
} 

を。 RGB空間での色の距離を計算し、それを正方形で計算し、それを0.1と比較します。これは、しきい値(0.1)を微調整するのが少し難しいかもしれませんが、ソフトしきい値を使用することができます。色のグラデーションを持ち、他の色よりも色がより透明であるようにしたい場合は、ステップ関数を捨て、代わりにsmoothstepを使用できます。