Создание текстуры SDL3 всегда возвращает NULLAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Создание текстуры SDL3 всегда возвращает NULL

Сообщение Anonymous »

У меня есть проблема в моем проекте Android SDL3 на C++:
Каждый раз, когда я пытаюсь создать текстуру, она возвращает 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;
}
(здесь я оставил только попытку 2, но с остальными попытками полностью аналогично)
Выходы
Журнал Android отфильтрован, чтобы показывать только мои журналы)
Полный журнал Android без фильтров (то же самое и со всеми остальными попытками)
Другое что я пробовал
  • Я пробовал использовать другие изображения, потому что, возможно, проблема была в моем изображении. Как вы можете видеть, в последней попытке я использовал «lettuce.bpm» вместо «center_arrow.bmp», но та же ошибка, так что проблема не в файле.
  • Я пробовал с другие устройства (3 разных смартфона), но та же ошибка.
  • Я пытался инициализировать рендерер с разными драйверами RendererDrivers, но ничего, та же ошибка, текстура всегда NULL.
  • Я попробовал прочитать исходные файлы SDL и обнаружил, что IMG_LoadTexture() на самом деле вызывает SDL_CreateTextureFromSurface(). Это объясняет, почему у них одна и та же ошибка. Поэтому проблема заключается только в функции SDL_CreateTextureFromSurface().
Наконец, я добавил несколько строк в мой код для чтения SDL_Properties окна и средства визуализации. Итак, я прочитал формат пикселей окна, а затем все форматы пикселей, поддерживаемые рендерером, и обнаружил, что они не совпадают (на всех трех устройствах):
Пиксель форматы окна и средства рендеринга
Я понятия не имею, является ли это причиной проблемы, но даже если бы это было так, я не знаю, что с этим делать. Пробовал принудительно добавлять формат окна в свойства рендерера (в форматы пикселей, поддерживаемые рендерером), но ТАКАЯ ОШИБКА, текстура NULL.
Начинаю думать что в SDL3 на данный момент невозможно добавить изображение, по крайней мере в андроиде, я не знаю, что еще сделать.

Подробнее здесь: https://stackoverflow.com/questions/790 ... lways-null
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»