2014-09-24 35 views
1

所以我有一個子畫面圖像和掩模精靈:Recolouring SDL2紋理

sprite image mask sprite

(掩模實際上是一種調色板圖像,其中,每個值是不同recolour區域,0是藍色即不重新着色)

這些區域將被重新着色爲任意顏色。

假設Sprite圖像被緩存/預加載爲SDL_Texture,實現這一點的最佳方式是什麼?我得到了一些提示,例如渲染到紋理,alpha混合,但沒有似乎適合與所有的「要求」

回答

2

我能想到兩種方式來實現這一目標:

更簡單的方法

您可以將每個recolour面積從分離以這種方式,每個蒙版紋理只有兩種顏色,一種是透明(alpha = 0),另一種是白色(255,255,255,255)。然後每次需要recolour您爲每個面具的顏色國防部設置爲所需的人,並與源紋理的結合,這樣的時間:

SDL_SetRenderTarget(r, destiny); 
SDL_SetBlendMod(r, SDL_BLENDMODE_NONE); 
SDL_RenderCopy(r, source, destiny); 
SDL_SetBlendMod(r, SDL_BLENDMODE_BLEND); 
for(/* Each mask as m*/){ */ 
    SDL_SetColorMod(m, c[i].r, c[i].g, c[i].b); 
    SDL_RenderCopy(r, source, destiny); 
} 

替代

另一種方法是做組合通過手工來避免以前的分離,將每個顏色區域映射到某個陣列或哈希映射中的最終顏色,然後穿過蒙版像素以及圖像並在需要時重新着色。這種方式更容易實現,如果你使用的表面和後轉換成質感,但你可以做兩種方式,所以我將解釋它在僞代碼:

s: source; 
d: destiny; 
m: mask; 
c: [0x00ff00: 0xff000000, 0x0000ff: 0xdeadbeef]; 
for(i=0; i< s.pixels.size(); ++i){ 
    if(c.count(m.pixels[i])){ 
     destiny = (c[m.pixels[i]]+s.pixels[i])/2; 
    } else { 
     destiny = s.pixels[i]; 
    } 
} 

在這兩個例子中我使用了常見的混合功能結合,但你可以嘗試別人,我認爲增加也可能是一個很好的選擇。

+0

我認爲「簡單的方法」就是我想要的,但我不確定你的意思是變量名 - 例如,是源/命運的主要紋理或面具 – LordAro 2014-09-26 16:17:51

+0

,我不完全確定掩模圖像應該看起來像什麼,你能舉個例子嗎? – LordAro 2014-09-26 16:18:32

+0

好吧,一切工作,它工作正常:)謝謝 – LordAro 2014-09-26 23:07:40