2017-04-14 1 views
1

J'ai essayé de travailler avec SDL et OpenGL pour un projet sur lequel je travaille, et pour faciliter les tests, je voudrais pouvoir dessiner en 2D à l'écran et la seule façon que j'ai trouvée pour me permettre de faire cela, SDL surfaces pour créer et dessiner des images BMP. C'est très bien car être en mesure de sauvegarder l'image sera une fonctionnalité intéressante plus tard, mais s'il y a une autre meilleure façon de le faire avec OpenGL ou une autre méthode, s'il vous plaît dites :).SDL surfaces et BMPs

C'est le code que je suis actuellement en utilisant:

int w = 255; 
int h = 255; 
SDL_Surface* surface = SDL_CreateRGBSurface(0,w,h,32,0,0,0,0); 
SDL_LockSurface(surface); 
int bpp = surface->format->BitsPerPixel; 
for (int i = 0; i < h; i++) 
{ 
    for (int j = 0; j < w; j++) 
    { 
     Uint32 *p = (Uint32 *)surface->pixels + (i * surface->pitch) + (j * bpp); 
     *p = SDL_MapRGB(surface->format,i,j,i); 
    } 
} 
SDL_UnlockSurface(surface); 
SDL_SaveBMP(surface, "Test.bmp"); 

Ceci est juste une chose de test de base pour me permettre de me réconcilier avec la façon de ce faire, je suis sûr que j'ai quelques problèmes avec gestion de la mémoire ici mais je ne sais pas si du tout pour supprimer * p. Le problème que j'ai le plus gros problème est cependant où j'utilise SDL_MapRGB. le programme se bloque quand il frappe ceci avec une faute de segmentation de SIGSEGV et je ne peux pas comprendre ce que je fais mal.

Répondre

1

Vous ne libérez pas la mémoire pointée par p.

Mais après utilisation, vous devez libérer le surface comme

SDL_FreeSurface(surface); 

En outre, bpp est en bits. Vous devez le diviser par 8 pour l'obtenir en octets.

Et, pour faire de l'arithmétique en octets, vous devez utiliser

Uint32 *p = (Uint32 *)((Uint8 *)surface->pixels + (i * surface->pitch) + (j * bpp)); 
+0

alors j'ai changé la ligne de BPP int bpp = en surface> Format-> BitsPerPixel/8, et l'octet ligne arithmétique à ce que vous dit mais je reçois une nouvelle erreur: impossible de convertir 'Uint8 * {aka unsigned char *}' en 'Uint32 * {aka unsigned int *}' lors de l'initialisation. Je n'utilise que Uint32 parce que d'après ce que j'ai lu, cela me permet d'utiliser jusqu'à 255 pour chacune des valeurs R, G et B, donc je suppose que c'est ce dont j'ai besoin. – Chris

+1

peu importe, j'ai utilisé 'Uint32 * p = (Uint32 *) ((Uint8 *) surface-> pixels + (i * surface-> pitch) + (j * bpp))' sur un coup de tête et cela a fonctionné, je viens nécessaire pour convertir en Uint32, merci !! – Chris

+0

@Chris: Merci pour le problème du moulage par pointeur. J'ai mis à jour ma réponse. –