OpenGL: Nichts funktioniert :-(



  • Wenn ich folgenden Code compiliere und ausführe, kommt statt eines weißen Quadrats ein durchsichtiges Fenster.

    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <GL/glut.h>
    
    void init() {
    	glClearColor( 0.0, 0.0, 0.0, 0.0 );
    	glMatrixMode( GL_PROJECTION );
    	glLoadIdentity();
    	glOrtho( 0.0, 1.0, 0.0, 1.0, -1.0, 1.0 );
    }
    
    void display() {
    	glClear( GL_COLOR_BUFFER_BIT );
    	glColor3f( 1.0, 1.0, 1.0 );
    	glBegin( GL_POLYGON );
    
    	glVertex3f( 0.25, 0.25, 0.0 );
    	glVertex3f( 0.75, 0.25, 0.0 );
    	glVertex3f( 0.75, 0.75, 0.0 );
    	glVertex3f( 0.25, 0.75, 0.0 );
    
    	glEnd();
    	glFlush();
    }
    
    int main (int argc, char** argv ) {
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    	glutInitWindowSize(640, 480);
    	glutInitWindowPosition(100, 100);
    	glutCreateWindow("test");
    	init();
    	glutDisplayFunc(display);
    	glutMainLoop();
    	return 0;
    }
    

    Der Code sollte Fehlerfrei sein, den hab ich nämlich aus dem Redbook abgeschrieben.

    Wenn ich für das Fenster SDL statt glut verwende, wird es schwarz.
    Was könnte der Grund hierfür sein?



  • habe zwar schon _sehr_ lange nichts mehr mit opengl mehr gemacht, aber könnte das nicht an deinem glClearColor-aufruf liegen? bei mir habtr der alpha-wert zawr nie funktioniert, aber ich habe auch nie glut verwendet. überhaupt ist es besser, wenn du sdl benutzt, denn glut ist schon so verdammt alt...



  • mmh, mit glut hab ich nix am hut, aber was mir hier fehlt ist eine behandlung der MODELVIEW matrix.
    Ob das hier wichtig ist, kann ich schwer sagen, normal zeichnet man nicht mit der PROJECTION matix.
    Ich weiss nicht ob OGL die PROJECTION auch mit multipliziert, wenn noch die MODELVIEW matrix verwendet, liese sich aber annehmen, und wenn das so ist, was steht in der MODELVIEW matrix drin? Ich weis nicht ob ogl die automatisch bei Start erstmal auf einheits matrix setzt...!



  • Wenn ich einen Doublebuffer verwende, funktioniert es mit GLUT (ka. warum),
    aber gibt mir einen Segmentation Fault mit SDL.

    hier mal nur die main():

    int main( ) {
    	SDL_Init( SDL_INIT_VIDEO );
    	screen = SDL_SetVideoMode( 250, 250, 16, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL );
    	if ( !screen ) {
    		cerr << SDL_GetError();
    	}
    	init();
    	SDL_Event event;
    	for ( ;; ) {
    		display();
    		if ( SDL_PollEvent( &event ) ) {
    			if ( event.type == SDL_QUIT ) break;
    		}
    	}
    	SDL_FreeSurface( screen );
    	SDL_Quit();
    	return 0;
    }
    

    EDIT:Offenbar stürzt das Programm ab beim Aufruf von SDL_Flip am Ende von Dislplay.



  • Flow_cplus schrieb:

    mmh, mit glut hab ich nix am hut, aber was mir hier fehlt ist eine behandlung der MODELVIEW matrix.
    Ob das hier wichtig ist, kann ich schwer sagen, normal zeichnet man nicht mit der PROJECTION matix.
    Ich weiss nicht ob OGL die PROJECTION auch mit multipliziert, wenn noch die MODELVIEW matrix verwendet, liese sich aber annehmen, und wenn das so ist, was steht in der MODELVIEW matrix drin? Ich weis nicht ob ogl die automatisch bei Start erstmal auf einheits matrix setzt...!

    Die Modelview-Matrix ist da, die wird auch benutzt, halt mit den Standardeinstellungen. Man muss sie ja nicht ändern, wenn kein Bedarf besteht.



  • Mein PlatformSDK hat leider keine glut.h hab das ganze mal für die glaux.h umgeändert und das läuft einwandfrei:

    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <GL/glaux.h>
    
    void init() {
    	glClearColor( 0.0, 0.0, 0.0, 0.0 );
    	glMatrixMode( GL_PROJECTION );
    	glLoadIdentity();
    	glOrtho( 0.0, 1.0, 0.0, 1.0, -1.0, 1.0 );
    }
    
    void display() {
    	glClear( GL_COLOR_BUFFER_BIT );
    	glColor3f( 1.0, 1.0, 1.0 );
    	glBegin( GL_POLYGON );
    
    	glVertex3f( 0.25, 0.25, 0.0 );
    	glVertex3f( 0.75, 0.25, 0.0 );
    	glVertex3f( 0.75, 0.75, 0.0 );
    	glVertex3f( 0.25, 0.75, 0.0 );
    
    	glEnd();
    	glFlush();
    }
    
    int main (int argc, char** argv ) {
    	auxInitDisplayMode(AUX_SINGLE | AUX_RGB);
    	auxInitPosition( 0, 0, 640, 480 );
    	auxInitWindow("test");
    	init();
    	auxMainLoop((AUXMAINPROC)display);
    	return 0;
    }
    

    Das einzige was ich hier geändert habe steht in der main, die anderen Funktionen habe ich unverändert von dir übernommen.



  • Pellaeon schrieb:

    Flow_cplus schrieb:

    mmh, mit glut hab ich nix am hut, aber was mir hier fehlt ist eine behandlung der MODELVIEW matrix.
    Ob das hier wichtig ist, kann ich schwer sagen, normal zeichnet man nicht mit der PROJECTION matix.
    Ich weiss nicht ob OGL die PROJECTION auch mit multipliziert, wenn noch die MODELVIEW matrix verwendet, liese sich aber annehmen, und wenn das so ist, was steht in der MODELVIEW matrix drin? Ich weis nicht ob ogl die automatisch bei Start erstmal auf einheits matrix setzt...!

    Die Modelview-Matrix ist da, die wird auch benutzt, halt mit den Standardeinstellungen. Man muss sie ja nicht ändern, wenn kein Bedarf besteht.

    Das heise Ogl setzt den ganzen Matrizes bei start auf die einheitsmatrix?? kann man sich darauf verlassen?



  • User-- schrieb:

    Mein PlatformSDK hat leider keine glut.h hab das ganze mal für die glaux.h umgeändert und das läuft einwandfrei:

    OK, dann kann ich jetzt zumindest mit ziemlicher Sicherheit davon ausgehen, dass mit meiner OpenGL / Mesa Implementierung was nicht stimmt oder ich irgendiwe falsche / nicht-zusammenpassende Pakete auf meinen System hab.

    Danke für deine Hilfe.

    (Der Segfault beim SDL-Programm lag übrigens daran, dass SDL wohl eine andere Funktion hat um die Buffer zu swappen wenn man OpenGL verwendet, nämlich SDL_GL_SwapBuffers(). Wenn ich die benutze sitze ich aber wieder vorm schwarzen Monitor. 😞 )



  • Habe mich geirrt, das geht bei mir doch nicht, es wird nur das Fenster erstellt, angezeigt wird nichts.
    Habe mal nen paar Programme ausm redbook getestet, das erste (das was du hast, nur in die main() verpackt) geht nicht, aber spätere Beispiele gehen seltsamerweise.
    Woran das liegt weiß ich auch nicht, habe selber noch nie wirklich was mit opengl gemacht.



  • Um... bei mir geht jetzt gar keins mehr (auch nicht mehr Example 1-2 mit Doublebuffer -- das das gestern noch lief.)
    😕 😕



  • hi
    ich hätte da zwei sachen die du versuchen könntest

    1.) versuch das polygon mit glTranslatef(x,y,z) weiter weg zu verschieben, sprich -100.f auf der z-achse. aufruf nach der glColor3f-methode

    2.) in der glClear auch noch den depth-buffer aufnehmen. `glClear(GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT);

    hoffe es hilft eins von beiden
    hab zwar noch nicht viel mit OpenGL gemacht aber dieses hat funktioniert

    MfG WedlWedl



  • WedlWedl schrieb:

    hi
    ich hätte da zwei sachen die du versuchen könntest

    1.) versuch das polygon mit glTranslatef(x,y,z) weiter weg zu verschieben, sprich -100.f auf der z-achse. aufruf nach der glColor3f-methode

    MfG WedlWedl

    Solches blindes rumgestocher sollte man lieber lassen. Man sollte lieber versuchen zu verstehen!
    Gerade in diesem Beispiel wuerde diese Loesung auf jeden Fall nur einen schwarzen Bildschirm produzieren, da die Clipping planes der ortho auf der z achse bei -1 und 1 sind. Schiebst du da 100 aud z achse rauf oder runter bist auf jedenfall meilenweit weg ;).

    Wenn man schon stochert, dann wenigsten ueberlegt!


Anmelden zum Antworten