SDL2 С++ Съемка снимка экрана

Привет, я хотел бы знать, можно ли просто снять скриншот с SDL2. Я пробовал SDL_GetWindowSurface, но я получаю сообщение об ошибке:

Нет доступных аппаратных ускорителей.

Я взял код здесь.

Другим решением, о котором я думал, является преобразование текстуры в поверхность, но мне это не удалось...

У вас есть решение?

Ответ 1

Похоже, вы смешиваете системы рендеринга. Этот метод будет работать только в контексте рендеринга программного обеспечения. Для аппаратного рендеринга вы должны использовать метод SDL_RenderReadPixels(). Чтобы сохранить скриншот, вам понадобится такой код:

SDL_Surface *sshot = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
SDL_RenderReadPixels(renderer, NULL, SDL_PIXELFORMAT_ARGB8888, sshot->pixels, sshot->pitch);
SDL_SaveBMP(sshot, "screenshot.bmp");
SDL_FreeSurface(sshot);

Где w и h - ширина и высота экрана (вы можете получить эти значения с помощью SDL_GetRendererOutputSize()).