所以我有一个精灵图片和一个面具精灵:


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

这些区域将重新着色为任意颜色。

假设将Sprite图片作为SDL_Texture缓存/预加载,实现此目的的最佳方法是什么?我得到了一些提示,例如渲染为纹理,进行Alpha混合,但似乎都不符合所有“要求”

最佳答案

我可以通过两种方式实现这一目标:

更简单的方法

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

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

在两个示例中,我都使用通用的blend函数进行组合,但是您可以尝试其他方法,我认为add也是一个很好的选择。

关于c++ - 重新着色SDL2纹理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26025709/

10-09 15:54