1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2

Загрузка текстур

04.04.2026, 23:42. Показов 3815. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Приложение грузит текстуры (файлы картинок) и создает из них QOpenGLTexture для рисованиях в окнах. Вполне возможно что одна и та же QOpenGLTexture потребуется в 2 и более местах, напр на разных моделях. Конечно в этом случае мы хотим использовать одну копию QOpenGLTexture, не создавая несколько раз одни и те же данные. Напрашивается использовать std::shared_ptr или QSharedPointer, но как конкретно это сделать? Пример структур
C++
1
2
3
4
struct Texture {
...
 QOpenGLTexture * m_texture;  // shared? 
};
Спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.04.2026, 23:42
Ответы с готовыми решениями:

SDL : Неадекватная загрузка текстур
Есть следующее приложение: Programm.h #include <windows.h> #include <SDL.h> #include <iostream>...

Удаление текстур OpenGL
Ребята подскажите как удалить текстуру? Через метод glDeleteTextures, если да то какие параметры...

Неправильная отрисовка текстур в OpenGL
Всем доброго дня, недавно начал изучать как работать с графикой и решил повторить пример из урока,...

24
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
10.04.2026, 10:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Igor3D Посмотреть сообщение
выполняет команду "replace image"
так просто реализуйте в классе текстура метод релоад который будет загружать новую текстуру из файла и вызывайте его по кнопке, да и автоматом в Qt это элементарно можно сделать.
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
10.04.2026, 22:28  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
так просто реализуйте в классе текстура метод релоад который будет загружать новую текстуру из файла
А что должен делать Texture::Reload ? И к каким последствиям это может привести?
Возможен (?) случай когда в мапе и в клиенте сидят разные указатели/данные по одному ключу.
Выходит "возможен"? Или как?

Добавлено через 3 часа 6 минут
На всякий случай уточню: в общем случае нет возможности изменить данные существующей QOpenGLTexture оставляя ее по тому же адресу. Можно только создать новую (из данного файла)
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
13.04.2026, 10:22
Цитата Сообщение от Igor3D Посмотреть сообщение
А что должен делать Texture::Reload ?
он должен перезагрузить файл текстуры, да QOpenGLTexture неперемещаемый и не копируеммый, но
Цитата Сообщение от Igor3D Посмотреть сообщение
На всякий случай уточню: в общем случае нет возможности изменить данные существующей QOpenGLTexture оставляя ее по тому же адресу. Можно только создать новую (из данного файла)
посмотрите что делает одна из перегрузок setData, не даром у него параметры как у одного из конструкторов.
Цитата Сообщение от Igor3D Посмотреть сообщение
Выходит "возможен"? Или как?
или как: если Вы специально это сделаете, то возможно. Я бы как-то так исполнил.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class TextureCache
{
    TextureCache(void) {}
 
    static std::unordered_map<std::string, std::weak_ptr<QOpenGLTexture>> m_cache;
    
public:
    TextureCache(const TextureCache &other) = delete;
    TextureCache(TextureCache &&other) = delete;
    TextureCache & operator=(const TextureCache &other) = delete;
    TextureCache & operator=(TextureCache &&other) = delete;
 
    static TextureCache & getInstance(void) { static TextureCache instance; return instance; }
    
    std::shared_ptr<QOpenGLTexture> getTexture(const std::string &path)
    {
        auto ptr = m_cache[path].lock();
        if (!ptr) {
            ptr = std::make_shared<QOpenGLTexture>(QImage(path.c_str()));
            m_cache[path] = ptr;
        }
        
        return ptr;
    }
    
    void reload(const std::string &path)
    {
        if (auto ptr = m_cache[path].lock()) {
            ptr->setData(QImage(path.c_str()));
        };
    }
};
Цитата Сообщение от Igor3D Посмотреть сообщение
к каким последствиям это может привести?
если объекты работают в разных потоках, то возможна гонка данных или даже UB, тогда модификация должна быть защищена мьютексом.
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
13.04.2026, 20:48  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
посмотрите что делает одна из перегрузок setData,
Согласен, для QOpenGLTexture можно перегрузить "только данные" (кстати, сразу не увидел), но этот случай не общий, напр объект может быть наследником QObject - и с приветом
Цитата Сообщение от Annemesski Посмотреть сообщение
Я бы как-то так исполнил.
Конкретно клиент - класс Texture. Какие члены он должен иметь, как юзать TextureCache? Будет ли это удобно?
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
14.04.2026, 09:56
Igor3D, если разделяемый объект не оставляет вариантов кроме как обязательное создание нового можно использовать класс обертку реализующий перезагрузку что-то типа фасада:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Texture
{
    const std::string m_path;
    std::unique_ptr<QOpenGLTexture> m_gltex;
 
public:
    Texture(const std::string &path) : m_path(path), m_gltex(std::make_unique<QOpenGLTexture>(QImage(path.c_str()))) { }
 
    void reload(void) { m_gltex.reset(new QOpenGLTexture(QImage(m_path.c_str()))); }
 
// проброс интерфейсов к opengl текстуре
};
 
class TextureCache
{
    TextureCache(void) {}
    static std::unordered_map<std::string, std::weak_ptr<Texture>> m_cache;
 
public:
    static TextureCache & getInstance(void) { static TextureCache instance; return instance; }
 
    std::shared_ptr<Texture> getTexture(const std::string &path)
    {
        auto ptr = m_cache[path].lock();
        if (!ptr) {
            ptr = std::make_shared<Texture>(QImage(path.c_str()));
            m_cache[path] = ptr;
        }
 
        return ptr;
    }
 
    void reload(const std::string &path)
    {
        if (auto ptr = m_cache[path].lock()) {
            ptr->reload();
        };
    }
};
Цитата Сообщение от Igor3D Посмотреть сообщение
Конкретно клиент - класс Texture. Какие члены он должен иметь, как юзать TextureCache? Будет ли это удобно?
По мне вполне удобно - это синглтон, подключил заголовок там где хочешь использовать кэш, взял инстанс (объект будет один на всю программу) и работаешь, типа

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <TextureCache.hpp>
 
class MyTexture
{
    std::shared_ptr<Texture> m_tex;
 
public:
    void load(const std::string &path)
    {
        m_tex = TextureCache::getInstance().getTexture(path);
    }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2026, 09:56

Генератор текстур( с чего начать)
Всем привет, решил для своего 3д проекта написать генератор текстур, пока что необходима текстура...

Вопрос о загрузке страницы
Подскажите, пожалуйста, как сделать так, чтобы в Buildere 6 при нажатиии кнопки (Button) на обычной...

Определение завершения загрузки страницы в CppWebBrowser
Проблема в следующем: есть страница, содержащая в себе несколько фреймов и ява-скриптов. Как...

Загрузка данных из файла
подскажите пожалуста как сделать так чтобы: К примеру на форма 5 штук Label (label1, Label2,...

Загрузка иконок в меню используя MFC
Подскажите, как добавить в пункт меню иконку? Работаю на в MFC проект на диалоге. Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru