Как имитировать более легкий эффект, как это делает Canvas globalCompositeOperation? - PullRequest
2 голосов
/ 10 декабря 2011

Каждый конец года я делаю фейерверк с отображением эффекта Холста (Javascript), последний был:

http://js1k.com/2011-dysentery/demo/955

Этот эффект прост: много кругов заполнено createRadialGradient), с некоторой прозрачностью.Секретом является свойство:

globalCompositeOperation = "lighter";

При использовании все цвета смешиваются, создавая ощущение света.В этом году я хочу сделать то же самое, но в SFML / C ++.Я начинающий в SFML и понятия не имею, с чего начать этот эффект.Может кто-нибудь показать мне, как имитировать Canvas globalCompositeOperation () в SFML?

1 Ответ

5 голосов
/ 10 декабря 2011

Вы можете получить этот эффект с sf::Blend::Mode.См. Этот пример:

    #include <SFML/Graphics.hpp>

    int main()
    {
        sf::RenderWindow window(sf::VideoMode(400, 400), "Blend::Mode Sample");
        sf::Shape square = sf::Shape::Rectangle(100, 100, 200, 200, sf::Color(250, 30, 30));
        sf::Shape circle1 = sf::Shape::Circle(100, 100, 50, sf::Color(30, 30, 250));
        sf::Shape circle2 = sf::Shape::Circle(300, 100, 50, sf::Color(30, 30, 250));
        sf::Shape circle3 = sf::Shape::Circle(100, 300, 50, sf::Color(30, 30, 250));
        sf::Shape circle4 = sf::Shape::Circle(300, 300, 50, sf::Color(30, 30, 250));
        circle1.SetBlendMode(sf::Blend::Alpha);
        circle2.SetBlendMode(sf::Blend::Add);
        circle3.SetBlendMode(sf::Blend::Multiply);
        circle4.SetBlendMode(sf::Blend::None);
        while (window.IsOpened())
        {
            sf::Event event;
            while (window.PollEvent(event))
                if (event.Type == sf::Event::Closed)
                    window.Close();

            window.Clear();
            window.Draw(square);
            window.Draw(circle1);
            window.Draw(circle2);
            window.Draw(circle3);
            window.Draw(circle4);
            window.Display();
        }
    }

Вывод:

Я думаю, что эффект, который вы хотите, будет SetBlendMode(sf::Blend::Add).

...