2014-09-24 2 views
1

Так что у меня спрайтов изображение и маска спрайтов:перекраска SDL2 текстуры

sprite image mask sprite

(маска на самом деле является палитрой изображение, в котором каждое значение является различная область перекрашивать, 0 является синим то есть не перекрашивается)

Эти области будут перекрашены в любой произвольный цвет.

Каков наилучший способ реализовать это, если изображение спрайта кэшируется/предварительно загружается как SDL_Texture? Мне дали некоторые подсказки, например. рендеринг в текстуру, полупрозрачность, но ни один выпирал со всем «требованием»

ответ

2

я могу думать два способов для достижения этой цели:

Легче путь

Вы можете отделить каждую зону перекрашивать от маска в нескольких текстурах, таким образом, каждая текстура маски имеет только два цвета, одна должна быть прозрачной (альфа = 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); 
} 

Alternative

Другой способ сделать это сочетание вручную, что позволило бы избежать предыдущего разделения, отображая каждую цветную область до окончательного цвета в каком-либо массиве или карте хэша и проходя через пиксель маски и изображения и перекрашивая, если вам нужно. Таким образом, в легче осуществить, если вы используете поверхности, а затем преобразовать текстуру, но вы можете сделать оба пути, поэтому я объясню это в псевдокоде:

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

В обоих примерах я использовал общую функцию смешивания для Комбинат, но вы можете попробовать другие, я думаю, что добавление может быть хорошей альтернативой.

+0

Я думаю, что «более простой способ» - это то, за что я бы пошел, но я не уверен, что вы подразумеваете под именами переменных - например. является источником/судьбой основной текстуры или маски – LordAro

+0

, и я не совсем уверен, что образ маски должен выглядеть так, не могли бы вы привести пример? – LordAro

+0

ОК, все проработал, он отлично работает :) Спасибо – LordAro