从Drawable中绘制并获取位图是否可行?

9
是否可能将绘制的Drawable作为Texture(位图)获取?请问我该如何做?
我的尝试

我修改了绿色圆形示例。现在它真的被绘制成位图了...

但是它只是这样绘制:

Unsmooth Arc.

我想要抗锯齿。

使用RenderWindow类时,我能够通过传递ContextSettings来设置抗锯齿。根据@Mario的建议,我需要RenderTexture,但不幸的是我无法控制它的ContextSettings

@AlexG的建议

我创建了一个Context,但我的编译器报错:my_test.cc:9:57: error: use of deleted function 'sf::Context::Context(const sf::Context&)'。有什么替代方案吗?

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>

int main()
{
    sf::ContextSettings settings =
        sf::ContextSettings(0, 0, 6);

    sf::Context context = sf::Context(settings, 200, 200);
    context.setActive(true);

    sf::RenderWindow window(
        sf::VideoMode(200, 200), "sfml test", sf::Style::Default,
        settings
    );

    sf::RenderTexture cacheTexture;
    if (!cacheTexture.create(200, 200)) return 0;
    cacheTexture.setSmooth(true);

    sf::CircleShape shape(100.f, 75);
    shape.setFillColor(sf::Color::Green);

    cacheTexture.setActive(true);
    cacheTexture.draw(shape);

    cacheTexture.setActive(false);
    context.setActive(false);

    sf::Sprite sprite = sf::Sprite(cacheTexture.getTexture());

    while (window.isOpen())
    {
        sf::Event event;

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

        window.clear();
        window.draw(sprite);
        window.display();
    }

    return 0;
}
2个回答

4

你可以像 @Mario 说的那样将图形绘制到一个 sf::RenderTexture 中。如果你将上下文设置传递给 sf::Context,你就可以像设置窗口一样设置抗锯齿级别(只要 sf::RenderTexture 是当前上下文)。

希望这可以帮助你!


1
如果我为您提供了https://www.sfml-dev.org/documentation/2.4.2/classsf_1_1Context.php,您会发现可以使用静态方法来获取当前上下文。我的建议是在调用setActive()之后获取上下文,然后调用getSettings()以获取对该上下文设置的引用,并在那里进行修改。 - Alex G
不错的想法...我尝试按照这些建议进行编译,但是我无法修改“ContextSettings # antialiasingLevel”成员,因为它是只读的,所以编译器在这里停止了。您对此有任何想法吗?这真的非常有限:v 看起来这是故意的,很认真。 - user5066707
很遗憾,我从文档中没有看到其他的路径。目前我没有安装任何东西,所以很遗憾无法提供实际帮助。是否有可能构建另一个ContextSettings对象并进行交换?如果它是一个引用,您可能可以在指针处交换数据。 - Alex G
呃,这可能很危险:V,因为“ContextSettings”可能以不同的形式存储... 好吧,这是真的。我可以替换指针处的值。但实际上,我无法做到... 我很困惑。 - user5066707
感谢你的帮助。我认为 @binary1248 已经解决了这个问题... https://github.com/SFML/SFML/pull/1285#issuecomment-330708937 - user5066707
显示剩余3条评论

2

这很容易完成。只需要将你的可绘制对象绘制到所需大小的 sf::RenderTexture 上,然后就可以使用 sf::RenderTexture::getTexture() 方法获得一个可使用或保存到文件的纹理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接