Задать вопрос
xzripper
@xzripper
0xC0000005

Текстура уничтожается?

// Sprite.
if(ImGui::CollapsingHeader("Sprite.")) {
    // Preview texture allocations.
    sf::Texture texture;

    // ...

    static char spritePath[MAX_OBJECTS_TEXT_SIZE / 2]; // (512 / 2)

    // ...

    if(ImGui::InputText("Sprite path.##sprite", spritePath, IM_ARRAYSIZE(spritePath))) {
        texture.loadFromFile(spritePath); // <- загрузка
    }

    // ...

    // Preview. (150, 150).
    ImGui::Image(texture, sf::Vector2f(DEFAULT_TEXTURE_PREVIEW_WIDTH, DEFAULT_TEXTURE_PREVIEW_HEIGHT), sf::Color::Transparent, sf::Color::White);
}


В результате получается пустой квадрат:
64df865208ffc249854937.png

example.png - точно существует и ошибок нету (о том что не удалось загрузить текстуру).

Из документации SFML -


Вы успешно загрузили текстуру, правильно построили спрайт, и... теперь все, что вы видите на своем экране, это белый квадрат. Что случилось?

Это распространенная ошибка. Когда вы устанавливаете текстуру спрайта, все, что он внутри делает, это сохраняет указатель на экземпляр текстуры. Поэтому, если текстура уничтожается или перемещается в другое место в памяти, спрайт оказывается с недопустимым указателем текстуры.


sf::Sprite loadSprite(std::string filename)
{
    sf::Texture texture;
    texture.loadFromFile(filename);

    return sf::Sprite(texture);
} // error: the texture is destroyed here (ошибка: спрайт уничтожен сдесь)


Я не понимаю почему текстура уничтожается, если я ее создал в одном блоке if? и как сделать что бы она не уничтожалась?

UPD: Функция ImGui::Image - рисует изображение в следующием кадре, а уже в следущем кадре текстура удаляется
  • Вопрос задан
  • 144 просмотра
Подписаться 1 Средний 4 комментария
Решения вопроса 1
xzripper
@xzripper Автор вопроса
0xC0000005
Оказывается третий аргумент tintColor в ImGui::Image окрашивает не только задний фон, но и саму текстуру, и этот tintColor я сделал прозрачным, не зная что оно делает текстуру также прозрачной. И еще сделал чтобы текстура хранилась на стеке, и теперь все заработало.
64e5033f37eae960043831.png
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
У вас тут переменная sf::Texture texture на стеке создается. Соответственно, она уничтожается при выходе за свои границы видимости. Вам надо создавать переменную в куче через new, а затем удалять ее через delete. Ну или использовать умные указатели, навроде std::shared_ptr
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы