所以我有一個子畫面圖像和掩模精靈:Recolouring SDL2紋理
(掩模實際上是一種調色板圖像,其中,每個值是不同recolour區域,0是藍色即不重新着色)
這些區域將被重新着色爲任意顏色。
假設Sprite圖像被緩存/預加載爲SDL_Texture,實現這一點的最佳方式是什麼?我得到了一些提示,例如渲染到紋理,alpha混合,但沒有似乎適合與所有的「要求」
所以我有一個子畫面圖像和掩模精靈:Recolouring SDL2紋理
(掩模實際上是一種調色板圖像,其中,每個值是不同recolour區域,0是藍色即不重新着色)
這些區域將被重新着色爲任意顏色。
假設Sprite圖像被緩存/預加載爲SDL_Texture,實現這一點的最佳方式是什麼?我得到了一些提示,例如渲染到紋理,alpha混合,但沒有似乎適合與所有的「要求」
我能想到兩種方式來實現這一目標:
您可以將每個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];
}
}
在這兩個例子中我使用了常見的混合功能結合,但你可以嘗試別人,我認爲增加也可能是一個很好的選擇。
我認爲「簡單的方法」就是我想要的,但我不確定你的意思是變量名 - 例如,是源/命運的主要紋理或面具 – LordAro 2014-09-26 16:17:51
,我不完全確定掩模圖像應該看起來像什麼,你能舉個例子嗎? – LordAro 2014-09-26 16:18:32
好吧,一切工作,它工作正常:)謝謝 – LordAro 2014-09-26 23:07:40