CTexture2DSharedPtr LoadFromDisk(const path &path)const
    {
        SDLSurfacePtr pSurface = LoadFileImage(path);
        const bool hasAlpha = SDL_ISPIXELFORMAT_ALPHA(pSurface->format->format);

        // Все изображения будем конвертировать в RGB или RGBA,
        //  в зависимости от наличия альфа-канала в исходном изображении.
        const uint32_t requiredFormat = hasAlpha
            ? SDL_PIXELFORMAT_ABGR8888
            : SDL_PIXELFORMAT_RGB24;
        if (pSurface->format->format != requiredFormat)
        {
            pSurface.reset(SDL_ConvertSurfaceFormat(pSurface.get(), requiredFormat, 0));
        }

        // В системе координат OpenGL отсчёт идёт с нижней левой точки,
        //  а не с верхней левой, поэтому переворачиваем изображение.
        CUtils::FlipSurfaceVertically(*pSurface);

        auto pTexture = std::make_shared<CTexture2D>();
        pTexture->Bind();
        pTexture->ApplyImageData(*pSurface);
        pTexture->ApplyTrilinearFilter();
        pTexture->ApplyMaxAnisotropy();
        pTexture->ApplyWrapMode(m_wrapS, m_wrapT);
        pTexture->GenerateMipmaps();
        pTexture->Unbind();

        return pTexture;
    }