如何在单个缓冲区上绘制以用于生成艺术目的

时间:2015-10-25 23:24:55

标签: c++ textures rendering sfml

我实际上遇到了一个我无法自行解决的问题,使用 SFML 我有一个单一的形状,并且我在处移动它框架,然后我画它。问题是,SFML使用两个缓冲区,每个缓冲区(帧)上的跟踪不会相同,并且会产生奇怪的闪烁效果。

我需要你的知识,我是否应该找到另一种方法,比如我将延伸的一系列形状。或者有没有办法跳过第二个缓冲区?将这个缓冲区变成一张纸,然后塑造我的笔刷。

        protected override void  OnSaveStateComplete(EventArgs e)

愿你度过愉快的一天。

2 个答案:

答案 0 :(得分:2)

你可以通过使用sf::RenderTexture作为后台缓冲区(单个缓冲区)来制作你的绘图,然后通过sf :: RenderWindow`在屏幕上绘制

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML art");
    window.setVerticalSyncEnabled(true);

    sf::RenderTexture target;
    if (!target.create(window.getSize().x, window.getSize().y))
        return -1;

    target.clear(sf::Color::White);
    target.display();

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
        {
            sf::CircleShape circle(5.f, 32u);
            circle.setPosition(sf::Vector2f(sf::Mouse::getPosition(window)));
            circle.setFillColor(sf::Color::Red);
            target.draw(circle, sf::BlendNone);
            target.display();
        }

        window.clear();
        window.draw(sf::Sprite(target.getTexture()));
        window.display();
    }
}

答案 1 :(得分:1)

双缓冲的目的是避免在渲染帧期间显示未完全渲染的场景的部分。所以你的问题与双缓冲本身无关。基本上,您需要生成每次渲染特定帧所需的所有基元。在您的具体情况下,您可以这样做:

sf::CircleShape circle;
//Init the circle (radius etc)
sf::Vector2f pos(0, 500);

int frameCount = 0;
while(!done)
{
    ++frameCount;
    for (int i = 0; i < frameCount; ++i) {
        circle.setPosition(pos + sf::Vector2f(i, 0));
        window.draw(circle);
    }
    window.display();
}