重新着色SDL2纹理

时间:2014-09-24 20:17:02

标签: c++ c textures sdl-2 blending

所以我有一个精灵图像和一个蒙版精灵:

sprite image mask sprite

(蒙版实际上是一个调色板图像,其中每个值都是不同的重新着色区域,0是不重新着色的蓝色)

这些区域将被重新塑造成任意颜色。

假设精灵图像被缓存/预加载为SDL_Texture,实现此目的的最佳方法是什么?我得到了一些提示,例如:渲染到纹理,alpha混合,但似乎都没有符合所有“要求”

1 个答案:

答案 0 :(得分:2)

我可以通过两种方式来思考:

更简单的方式

您可以在多个纹理中将每个重新着色区域与蒙版分开,这样每个蒙版纹理只有两种颜色,一种是透明(alpha = 0),另一种是白色(255,255,255,255)。然后,每次你需要重新着色时,你将每个蒙版的颜色模式设置为所需的颜色和与源纹理的组合,如下所示:

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];
    }
}

在这两个例子中我都使用了常用的混合功能,但你可以尝试其他功能,我认为添加也可能是一个很好的选择。