所以我有一个子画面图像和掩模精灵: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