Рендеринг пикселей из массива значений RGB в SDL 1.2?
Я сейчас работаю над эмулятором NES и не могу понять, как визуализировать пиксели. Я использую трехмерный массив для хранения значения RGB каждого пикселя. Определение массива выглядит следующим образом для размера экрана 256 x 224:
byte screenData[224][256][3];
Например, [0][0][0]
содержит синее значение, [0][0][1]
содержит зеленые значения и [0][0][2]
содержит значение красного пикселя в позиции экрана [0][0]
,
Когда флаг vblank поднимается высоко, мне нужно визуализировать экран. Когда SDL переходит к визуализации экрана, массив screenData будет заполнен значениями RGB для каждого пикселя. Я смог найти функцию с именем SDL_CreateRGBSurfaceFrom
казалось, что это может сработать для того, что я хочу сделать. Тем не менее, все примеры, которые я видел, используют одномерные массивы для значений RGB, а не трехмерный массив.
Что было бы для меня лучшим способом для рендеринга моих пикселей? Было бы также неплохо, если бы функция позволяла мне как-то изменять размер поверхности, чтобы мне не приходилось использовать размер окна 256 x 224.
2 ответа
Вам нужно хранить данные как одномерные char
массив:
int channels = 3; // for a RGB image
char* pixels = new char[img_width * img_height * channels];
// populate pixels with real data ...
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)pixels,
img_width,
img_height,
channels * 8, // bits per pixel = 24
img_width * channels, // pitch
0x0000FF, // red mask
0x00FF00, // green mask
0xFF0000, // blue mask
0); // alpha mask (none)
В 2.0 используйте SDL_Texture
+ SDL_TEXTUREACCESS_STREAMING
+ SDL_RenderCopy
, это быстрее чем SDL_RenderPoint
,
Увидеть:
- официальный пример: http://hg.libsdl.org/SDL/file/e12c38730512/test/teststreaming.c
- Мой производный пример, который не требует данных BLOB-объектов и сравнивает оба метода: https://github.com/cirosantilli/cpp-cheat/blob/0607da1236030d2e1ec56256a0d12cadb6924a41/sdl/plot2d.c