2014-09-04 26 views
0

我有一個非常大的紋理我用作背景,我想將過濾器應用到它的一小部分,「小部分」由另一個紋理的alpha層定義有(這仍然是RGB8888),我不知道什麼是最好的方法來做到這一點。我想保持我已經使用其他精靈一樣(很簡單)着色器,這是基本類似一個,即:在OpenGL 2中使用蒙版去飽和紋理

precision mediump float; 
uniform sampler2D uTexture; 
varying vec2 vTexPos; 
void main() { 
    gl_FragColor = texture2D(uTexture, vTexPos); 
} 

所以,我有一些問題

  • 我如何才能將我的過濾器應用於「蒙面」區域並避免吸引其他人?
  • 如果我再次繪製大紋理,然後將其應用到屏幕的一小部分,我是否會有任何性能損失?
  • 我可以映射第二個紋理到着色器並使用類似「if uTexture2!= null」 - >應用爲掩碼的內容嗎?與使用第二個着色器相比,這會給我什麼性能提升嗎?
  • 這兩個紋理預乘,我應該如何處理alpha蒙版?

喜歡什麼ID做的就是這樣的事情(原件,面具,結果):使用GLES20

Base Texture Alpha Mask Result

我的環境是Android 4.0的,即時通訊。

回答

1

您需要使用附加遮罩紋理採樣器的顏色測試以及基於條件的一些去飽和濾鏡。

此片段着色器應該工作:

precision mediump float; 
uniform sampler2D uTexture; 
uniform sampler2D uMask; 
varying vec2 vTexPos; 

void main() { 
    vec4 mask = texture2D(uMask, vTexPos); 
    if(mask.r < 0.9) { // black mask 
     gl_FragColor = texture2D(uTexture, vTexPos); 
    } else { // white mask 
     vec4 texelColor = texture2D(uTexture, vTexPos); // original color 
     vec4 scaledColor = texelColor * vec4(0.3, 0.59, 0.11, 1.0); // weights calculation 
     float luminance = scaledColor.r + scaledColor.g + scaledColor.b; // greyscale 
     gl_FragColor = vec4(luminance, luminance, luminance, texelColor.a); // final color with original alpha value 
    } 
} 

飽和度降低的代碼是從這篇大文章: http://franzzle.wordpress.com/2013/03/25/use-a-opengl-es-2-0-shader-to-show-a-desaturated-sprite-in-cocos2d-2-0/