2014-09-24 59 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