2017-04-14 10 views
1

Ich habe versucht, mit SDL und OpenGL für ein Projekt zu arbeiten Im arbeiten, und um einfache Tests zu ermöglichen, würde ich gerne in der Lage sein, in 2D auf den Bildschirm und die einzige Möglichkeit, die ich gefunden habe Um dies zu ermöglichen, müssen SDL-Oberflächen erstellt und BMP-Bilder gezeichnet werden. Das ist in Ordnung, denn das Speichern des Bildes wird später ein nettes Feature sein, aber wenn es einen anderen, besseren Weg gibt, dies mit openGL oder einer anderen Methode zu tun, sag bitte :).SDL-Oberflächen und BMPs

Dies ist der Code Ich bin derzeit mit:

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"); 

Dies ist nur eine grundlegende Prüfung, was mir zu erlauben, zu Bedingungen zu bekommen, wie dies zu tun, ich bin sicher, ich habe einige Probleme mit dem Gedächtnis hier Handhabung aber ich bin mir nicht sicher wann, wenn überhaupt * p zu löschen. Das Problem, mit dem ich das größte Problem habe, ist, wo ich SDL_MapRGB verwende. Das Programm stürzt ab, wenn es mit einem SIGSEGV Segmentierungsfehler auftaucht und ich kann nicht herausfinden, was ich falsch mache.

Antwort

1

Der Speicher, auf den zeigt, wird nicht freigegeben.

Aber nach dem Gebrauch müssen Sie die surface als

SDL_FreeSurface(surface); 

auch frei, bpp in Bits ist. Sie müssen es durch 8 teilen, um es in Bytes zu erhalten.

Und tun Arithmetik in Bytes, müssen Sie verwenden

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

so änderte ich die bpp Linie bpp = Aufputz-> Format-> BitsPerPixel/8 und die Byte-Arithmetik Linie auf das, was Sie in int sagte aber ich erhalte einen neuen Fehler: kann 'Uint8 * {aka unsigned char *}' zu 'Uint32 * {aka unsigned int *}' in der Initialisierung nicht konvertieren. Ich benutze nur Uint32, weil das, was ich gelesen habe, es mir erlaubt, bis zu 255 für jeden der R-, G- und B-Werte zu verwenden, also nehme ich an, was ich brauche. – Chris

+1

macht mir nichts aus, ich habe 'Uint32 * p = (Uint32 *) ((Uint8 *) Oberfläche-> Pixel + (i * Oberfläche-> Tonhöhe) + (j * bpp))' auf eine Laune und es hat funktioniert, ich gerade benötigt, um zu Uint32 zu konvertieren, danke !! – Chris

+0

@Chris: Danke für das Pointer Cast Problem. Ich habe meine Antwort aktualisiert. –

Verwandte Themen