【问题标题】:Is it possible to draw a Drawable and get a bitmap from it?是否可以绘制 Drawable 并从中获取位图?
【发布时间】:2018-02-12 16:53:54
【问题描述】:

是否可以将绘制的Drawable 作为Texture(位图)?请问我该怎么做?


我的尝试

我修改了绿色圆圈的例子。现在它真的被绘制成位图了……

但它是这样画的:

我想要抗锯齿

使用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;
}

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

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

    希望有帮助!

    【讨论】:

    • 无法将Context 链接到RenderTexture :(
    • 不明确,不。但是在sf::RenderTexture 上调用setActive() 会使其成为当前上下文。
    • 由于某种原因我无法构造Context
    • 如果我向您推荐 [sfml-dev.org/documentation/2.4.2/classsf_1_1Context.php](docs),您应该看到您可以使用静态方法来获取当前上下文。我的建议是在 rendertex 上调用 setActive() 后获取上下文,然后调用 getSettings() 来获取对该上下文设置的引用并在那里修改它们。
    • 好主意...我已经尝试在这些建议之后进行编译,但我无法修改 ContextSettings#antialiasingLevel 成员,因为它是只读的,所以编译器在这里停止。你对那个案子有什么想法吗?这是超级有限的:v 这看起来很提议,很严肃。
    【解决方案2】:

    这很简单。只需将您的可绘制对象绘制到所需大小的sf::RenderTexture,您就可以使用sf::RenderTexture::getTexture() 来获取可以使用或保存到文件的纹理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      相关资源
      最近更新 更多