【问题标题】:Recolouring SDL2 textures重新着色 SDL2 纹理
【发布时间】:2014-09-24 20:17:02
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我可以通过两种方式来实现这一点:

    更简单的方法

    您可以在多个纹理中将每个重新着色区域与蒙版分开,这样每个蒙版纹理只有两种颜色,一种是透明的 (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];
        }
    }
    

    在这两个例子中我都使用了常用的 blend 函数来组合,但你可以尝试其他的,我认为 add 也可能是一个不错的选择。

    【讨论】:

    • 我认为“更简单的方法”是我想要的,但我不确定你所说的变量名是什么意思 - 例如源/命运是主要纹理还是蒙版
    • 我也不完全确定蒙版图像应该是什么样子,你能举个例子吗?
    • 抱歉,我离开电脑了。源头是你改造前的形象,命运是你改造后的形象。我把它分开是因为转换是不可逆的。每个蒙版应该只有两种颜色,一种是透明的,另一种是带有一些 alpha 的白色(或者没有,如果您使用 SDL_BLENDMODE_ADD 或 SDL_BLENDMODE_MUL)。在我的示例中,它们是某种数组,但您可以找出其他方式来组合它们。
    猜你喜欢
    • 2013-06-13
    • 2019-01-12
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多