Преобразование разрядности SDL

#sdl #sdl-2

#sdl #sdl-2

Вопрос:

Я пробиваюсь через преобразование 1.2-> 2.0, по одной проблеме за раз. Пока у меня есть звук, взаимодействие и экран, который показывает… ну, хоть что-то.

Я уверен, что проблема связана с разрядностью и / или форматами. Исходный код использовал 8-битные индексированные SPR-файлы для спрайтов, загружал их в серию uint8 *buffu , а затем выводил их на поверхность дисплея.

Я портировал это, следуя руководству и значительному методу проб и ошибок (множество режимов и переключателей просто не работают на моей машине), создав текстуру и поверхность, позволяя старому коду всплывать на поверхность, а затем сделать это…

 SDL_UpdateTexture(sdltxtr, NULL, sdlsurf->pixels, 640 * sizeof (uint8));
SDL_RenderClear(sdlrend);
SDL_RenderCopy(sdlrend, sdltxtr, NULL, NULL);
SDL_RenderPresent(sdlrend);
 

Результатом является экран с материалом, но все это смещено. Я предполагаю, что это связано с тем, что поверхность и текстура имеют разные битовые глубины и форматы, чем спрайты…

 sdltxtr = SDL_CreateTexture(sdlrend,
                            SDL_PIXELFORMAT_ARGB8888,
                            SDL_TEXTUREACCESS_STREAMING,
                            640, 480);
sdlsurf = SDL_CreateRGBSurface(0, 640, 480, 8, 0,0,0,0);
 

Я пробовал различные настройки из документации, чтобы попытаться получить поверхность или текстуру с 8-разрядным индексом, но все флаги делают поверхность или текстуру пустыми.

Есть предложения?

Комментарии:

1. Ваш surface всегда обновляется? Или это спрайт, который не меняется со временем?

2. Поверхность постоянно обновляется, поскольку в нее вводятся новые растровые изображения. Тем не менее, вы можете увидеть проблему, как только начнется игра, период, когда все, что она делает, это загружает несколько растровых изображений в Surface и сидит там в ожидании ввода. Я вижу, что растровые изображения загружаются в поверхность / текстуру, но они «неправильные».

Ответ №1:

Вы упоминаете индексированную 8-разрядную графику. Предполагая, что индексированный означает палитированный, вы не можете просто использовать пиксельный буфер, поскольку это всего лишь список записей в связанной цветовой палитре SDL_Surface.

При этом вам необходимо создать буфер, который фактически содержит правильные значения ARGB из палитры, но не индексные значения, связанные с пиксельным буфером.

Вы можете использовать SDL_ConvertSurfaceFormat() для преобразования вашей 8-разрядной палитрированной поверхности в 32-разрядную ARGB-поверхность и поместить ее буфер в SDL_Texture. Вы также можете создать собственный 32-разрядный буфер ARGB и выполнить преобразование самостоятельно, просмотрев правильные коды палитры (хотя первый вариант в большинстве случаев будет проще).

Перед преобразованием 8-разрядной SDL_Surface в 32-разрядную, вы должны связать с ней допустимую палитру (SDL_SurfaceSetPalette()).