ubuntuusers.de

[c++/SDL] OpenGL

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Nilres

Anmeldungsdatum:
7. Dezember 2006

Beiträge: 371

Es geht um ganz einfachen Code:

	SDL_Surface *screen;
	screen = SDL_SetVideoMode(640, 480, 16,SDL_OPENGL);
	if (screen == NULL) {
		cout<<"Screen konnte nich erstellt werden, exit(1) \n"<<SDL_GetError()<<"\n";
		exit(1);
	}
	atexit(SDL_Quit);
	SDL_Surface *option_image;
	option_image = SDL_LoadBMP("option.bmp");
	SDL_BlitSurface(option_image, NULL, screen, NULL);
	SDL_FreeSurface(option_image);
	SDL_UpdateRect(screen, 0, 0, 0, 0);

Geht nich wenn ich aber statt dem "screen = SDL_SetVideoMode(640, 480, 16,SDL_OPENGL);" "screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE);" Schreibe gehts. meine frage nun ist wenn ich OpenGL verwenden möchte muss ich dann auch alle BMP's immer mit OpenGL anzeigen lassen weil zu dem Zeitpunkt brauch ich OpenGL noch nicht das käme erst später.

mfg nils

sxfreak

Avatar von sxfreak

Anmeldungsdatum:
27. Juni 2006

Beiträge: 436

Hi

Du musst dafür zusätzlich SDL_OPENGLBLIT als flag übergeben. Siehe Doku.

lg sx

Nilres

(Themenstarter)

Anmeldungsdatum:
7. Dezember 2006

Beiträge: 371

Danke schonmal soweit.

Aber leider gehts immernoch nich:

int main(int argc, char* argv[]) {
	SDL_Surface *screen;
	screen = SDL_SetVideoMode(800, 600, 32, SDL_OPENGL | SDL_OPENGLBLIT);
	if (screen == NULL) {
		cout<<"Screen konnte nich erstellt werden, exit(1) \n"<<SDL_GetError()<<"\n";
		exit(1);
	}
	atexit(SDL_Quit);
	SDL_Surface *option_image;
	option_image = SDL_LoadBMP("option.bmp");
	SDL_BlitSurface(option_image, NULL, screen, NULL);
	SDL_FreeSurface(option_image);
	SDL_UpdateRect(screen, 0, 0, 0, 0);
	cin.get();
	Init_OpenGL();
	Render();
	cin.get();
void Render() {
     glClear(GL_COLOR_BUFFER_BIT);

     glBegin(GL_TRIANGLES);
     glColor3f(0.0f, 0.0f, 1.0f);
     glVertex3f(0.0f, 0.5f, 0.0f);
     glColor3f(1.0f, 0.0f, 0.0f);
     glVertex3f(0.5f, -0.5f, 0.0f);
     glColor3f(0.0f, 1.0f, 0.0f);
     glVertex3f(-0.5f, -0.5f, 0.0f);
     glEnd();

     SDL_GL_SwapBuffers();
}
void Init_OpenGL() {
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);    //doublebuffering soll verwendet werden

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);           //schwarzer hintergrund (dazu mehr in der render funktion)

	glShadeModel(GL_SMOOTH);                        //weichere farbuebergaenge auf koerpern
}

Das Dreieck wird korrekt dagestellt aber das erste Bild leider nicht wieso?

mfg nils

Nilres

(Themenstarter)

Anmeldungsdatum:
7. Dezember 2006

Beiträge: 371

Weiß denn keiner wieso es nich geht?

Beggi

Anmeldungsdatum:
9. September 2007

Beiträge: 9

Hi,

Für mich sieht es so aus, als würdest Du die Funktion "SDL_FreeSurface()" zu früh aufrufen (und damit den Inhalt des surface gleich zu Beginn löschen). Also, wenn der Speicher erst gegen Ende des Programms freigegeben wird, könnte es funktionieren.

MfG Beggi

Ireyon

Anmeldungsdatum:
6. Juni 2007

Beiträge: 59

das glaube ich nicht. was soll eig mit dem Bild bezweckt werden?

Antworten |