У тебя есть вещи задом наперед.Вы должны заметить, что SDL_LockTexture
принимает указатель на указатель.Это связано с тем, что в SDL уже есть буфер соответствующего размера для текстуры, и ему необходимо указать адрес (и высоту), чтобы вы могли записать в этот буфер.
У вас также есть проблема, которую вы считаете возможнымиспользуйте FILE*
в качестве пиксельного буфера.Это совсем не так;FILE*
- это указатель на структуру, описывающую файл, а не на его содержимое.
Вам нужно сделать что-то вроде:
// create your empty texture
...
int pitch = 0;
char* p = NULL;
SDL_LockTexture(buffer, NULL, &p, &pitch);
... // Error checking
// now open your file and mmap it
int fd = open(Path, O_RDONLY);
struct stat sb;
fstat(fd, &sb);
const char* memblock = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
... // Error checking
// now you need to copy the data from the file to the pixel buffer
// you claim you are working with 800x600 32bit image data
for (int y = 0; y < 600; ++y)
{
const char* src = &memblock[y * pitch]; // is this really the pitch of the file? you didn't specify....
char* dst = &p[y * pitch];
memcpy(dst, src, 800*4); // width * size of a pixel
}
этот код предполагает, что вы не сделалиошибка где-то еще, например, размер текстуры или формат пикселей.Вы также заметите некоторые неизвестные в коде, которые вам нужно выяснить.
Вы также можете попробовать SDL_UpdateTexture
, который примет указатель на пиксели, как вы пытаетесь в своем коде.Тем не менее, он, вероятно, будет намного медленнее, чем SDL_LockTexture
, и вам все равно нужно будет на самом деле прочитать файл (или еще лучше mmap
его), чтобы передать пиксели.
Еще 3-й вариант,если SDL_Image
знает, как читать ваш файл "RAW", значит использовать IMG_Load
, чтобы получить SDL_Surface
вашего изображения, а затем создать текстуру с этой поверхности, используя SDL_CreateTextureFromSurface