Эффект плазменного спрайта SFML?

Есть ли способ создать эффект плазмы в SFML, который не замедляет мою частоту кадров?


person William    schedule 16.05.2010    source источник


Ответы (2)


1) Управляйте битами изображения непосредственно в памяти как массив байтов (или int/что угодно, в зависимости от вашей целевой глубины цвета). Не используйте каждый раз ничего, что GetsPixel() из изображения.

2) Минимизируйте свою математику. Для эффектов плазмы вы обычно будете использовать множество триггерных функций, которые довольно медленны, когда вы их выполняете (высоташириначастота кадров) раз в секунду. Либо используйте быструю специализированную математическую библиотеку для своих расчетов, либо, что еще лучше, кэшируйте расчеты в начале и используйте справочную таблицу во время эффекта, чтобы полностью исключить математику из каждого кадра.

3) Одной из вещей, которая заставляла плазменные эффекты старой школы работать так быстро, была смена палитры. Я не знаю какого-либо способа воспроизвести это (или палитры в целом) с помощью SFML напрямую, но вы можете использовать шейдеры GLSL, чтобы получить такой же результат без большого снижения производительности. Что-то вроде этого:

float4 PS_ColorShift(float2 Tex : TEXCOORD0) : COLOR0 
{ 
    float4 color = tex2D(colorMap, Tex);

    color.r = color.r+sin(colorshift_timer+0.01f);
    color.g = color.g+sin(colorshift_timer+0.02f);
    color.b = color.b+sin(colorshift_timer+0.03f);
    color.a = 1.0f;

    saturate(color);

    return color;
}
person nathanchere    schedule 21.09.2010

Можете ли вы просто сделать эффект плазмы в оперативной памяти, затем поместить его на текстуру и загрузить? Это не шейдерный эффект, но он даст вам эффект плазмы.

person Michael Dorgan    schedule 16.05.2010