gpt4 book ai didi

c++ - 重新着色 SDL2 纹理

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:49 25 4
gpt4 key购买 nike

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

sprite image mask sprite

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

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

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

最佳答案

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

更简单的方法

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

备选

另一种方法是手动进行组合,这样可以避免之前的分离,将每个颜色区域映射到某个数组或 HashMap 中的最终颜色,然后遍历蒙版和图像的像素,如果你需要重新着色需要。如果你使用表面然后转换为纹理,这种方式更容易实现,但你可以两种方式都做,所以我将用伪代码解释它:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com