Каждый раз, когда я пытаюсь создать текстуру, она возвращает NULL, а если я вызываю SDL_GetError(), она абсолютно ничего не говорит. И я перепробовал все:
Код: Выделить всё
// ATTEMPT 1
SDL_Surface* surface = SDL_LoadBMP("center_arrow.bmp");
if (surface == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load surface: %s\n", SDL_GetError());
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
if (texture == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load texture: %s\n", SDL_GetError());
Не удалось загрузить текстуру:
(Это означает, что поверхность была создана успешно, но SDL_CreateTextureFromSurface() вернула NULL без каких-либо объяснений со стороны SDL_GetError())
Итак, я установил SDL3_Image.
Код: Выделить всё
// ATTEMPT 2
SDL_Texture* texture = IMG_LoadTexture(renderer, "center_arrow.png");
if (texture == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load texture: %s\n", SDL_GetError());
Не удалось загрузить текстуру:
(IMG_LoadTexture(), функция из совершенно новой библиотеки, выдает точно такую же ошибку, она возвращает NULL без каких-либо объяснений со стороны SDL_GetError(). Я также использовал новый формат файла, PNG вместо BMP, но результат тот же)
Поэтому я попробовал другие функции библиотеки IMG.
Код: Выделить всё
// ATTEMPT 3
SDL_Surface* surface = IMG_Load("center_arrow.png");
if (surface == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load surface: %s\n", SDL_GetError());
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
if (texture == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load texture: %s\n", SDL_GetError());
Не удалось загрузить текстуру:
(Это означает, что поверхность создана успешно, но текстура NULL);
Поэтому я попытался преобразовать PixelFormat поверхности в PixelFormat окна.
Код: Выделить всё
// ATTEMPT 4
SDL_PixelFormat windowPixelFormat = SDL_GetWindowPixelFormat(window);
SDL_Surface* surface = SDL_LoadBMP("lettuce.bmp");
if (surface == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load surface: %s\n", SDL_GetError());
else
SDL_Log("Surface pixel format: %s", SDL_GetPixelFormatName(surface->format));
SDL_Surface* converted_surface = SDL_ConvertSurface(surface, windowPixelFormat);
if (converted_surface == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not convert surface: %s\n", SDL_GetError());
else
SDL_Log("Converted surface pixel format: %s", SDL_GetPixelFormatName(converted_surface->format));
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, converted_surface);
if (texture == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load texture: %s\n", SDL_GetError());
Формат пикселей поверхности: SDL_PIXELFORMAT_ARGB8888
Формат пикселей преобразованной поверхности: SDL_PIXELFORMAT_RGB565
Не удалось загрузить текстуру:
(Еще раз... текстура всегда NULL, я в отчаянии)
Мой полный код очень прост, он состоит только из одного файла.
Код: Выделить всё
#include
#include
#include
int main(int argc, char *argv[]) {
(void)argc;
(void)argv;
if (!SDL_Init(SDL_INIT_EVENTS | SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_Init failed (%s)", SDL_GetError());
SDL_Quit();
return 1;
}
if (!IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG)) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "IMG_Init failed.");
SDL_Quit();
return 1;
}
SDL_DisplayID* displayID = SDL_GetDisplays(NULL);
const SDL_DisplayMode* screen = SDL_GetCurrentDisplayMode(*displayID);
if (screen == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_GetCurrentDisplayMode failed (%s)", SDL_GetError());
else
SDL_Log("Screen resolution: %dx%d", screen->w, screen->h);
SDL_Window* window = SDL_CreateWindow("Game", screen->w, screen->h, SDL_WINDOW_VULKAN | SDL_WINDOW_FULLSCREEN);
if (window == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create window: %s\n", SDL_GetError());
}
SDL_Renderer* renderer = SDL_CreateRenderer(window, NULL);
if (renderer == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not create renderer: %s\n", SDL_GetError());
}
// ATTEMPT 2
SDL_Texture* texture = IMG_LoadTexture(renderer, "center_arrow.png");
if (texture == NULL)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not load texture: %s\n", SDL_GetError());
SDL_Quit();
IMG_Quit();
return 0;
}
Выходы
Журнал Android отфильтрован, чтобы показывать только мои журналы)
Полный журнал Android без фильтров (то же самое и со всеми остальными попытками)
Другое что я пробовал
- Я пробовал использовать другие изображения, потому что, возможно, проблема была в моем изображении. Как вы можете видеть, в последней попытке я использовал «lettuce.bpm» вместо «center_arrow.bmp», но та же ошибка, так что проблема не в файле.
- Я пробовал с другие устройства (3 разных смартфона), но та же ошибка.
- Я пытался инициализировать рендерер с разными драйверами RendererDrivers, но ничего, та же ошибка, текстура всегда NULL.
- Я попробовал прочитать исходные файлы SDL и обнаружил, что IMG_LoadTexture() на самом деле вызывает SDL_CreateTextureFromSurface(). Это объясняет, почему у них одна и та же ошибка. Поэтому проблема заключается только в функции SDL_CreateTextureFromSurface().
Пиксель форматы окна и средства рендеринга
Я понятия не имею, является ли это причиной проблемы, но даже если бы это было так, я не знаю, что с этим делать. Пробовал принудительно добавлять формат окна в свойства рендерера (в форматы пикселей, поддерживаемые рендерером), но ТАКАЯ ОШИБКА, текстура NULL.
Начинаю думать что в SDL3 на данный момент невозможно добавить изображение, по крайней мере в андроиде, я не знаю, что еще сделать.
Подробнее здесь: https://stackoverflow.com/questions/790 ... lways-null
Мобильная версия