OpenGL unter 10.3

G

Gammon

Neues Mitglied
Thread Starter
Dabei seit
11.09.2004
Beiträge
7
Reaktionspunkte
0
Hi...
ich möchte unter 10.3 in openGL (GLUT) programmieren und hab mir auch schon das SDK dafür runtergeladen. Nur sind da keine Bibliotheken (z.B. libgl.a) dabei.
Durch n bischen hin und her hab ich jetzt die libGL und die libGLU gefunden und geklinkt gekriegt.
Nur die libGLUT find ich nirgends.

Kann mir jemand helfen?
 
Hi!

Zuerst eine Gegenfrage: Wozu brauchst du die Glut- Library? GLUT ist nur eine Art vereinfachte Schnittstelle zu OpenGL. Sie greift auf die GL und GLU Bibliotheken zu. Sofern du das OpenGL SDK (http://developer.apple.com/opengl/) downgeloaded und installiet hst, dürfte dir nichts mehr im Wege stehen...

Mfg
Becher
 
Ähm, was versuchst du da?

Willst du alles über die Kommando-Zeile machen, oder wie? Wenn ja, dann "-framework OpenGL -framework GLUT" anhängen.

Wenn du XCode benutzt, dann die beiden Frameworks in die Framework-Liste mit aufnehmen.
 
@Becher:
Öhm z.B: für glutInitDisplayMode(...), oder für glutMainLoop() !?????
Allerdings installieren konnte ich da nix. Wenn ich das DMG ausführ bekomm ich nur ein paar andere Ordner (tolle beschreibung, gell ;-)) mit den ganzen h - Files, aber die hab ich ja schon, ich müßte nur noch die Bilbiotheken richtig verlinken, d.h. nur die glut.h , weil die gl.h und die glu.h gehen schon mit -lGL und -lGLU.

@Nuke:
Das mit der Komandozeile ist schon richtig, allerdings kenn ich den Befehl so:
g++ prog.c -o prog -lGL -lGLU -lGLUT

Die Fehlermeldung lautet dann:
Undefined Symbols:
_glutCreateWindow
_glutDisplayFunc
_glutInitDisplayMode
_glutMainLoop


Mit xCode hab ichs auch schon versucht, aber da krieg ich nichtmal n anständiges "HALLO WELT" prog hin (...), möcht aber auch ganz gern beim gcc bleiben.

Aber vielleicht hab ich da auch was ganz falsch verstanden und geh das Ganze von ner völlig falschen Seite an, wenn ihr meint, das ich da "nur" was installieren muß...
 
Hi.

Installieren musst du gar nix mehr. Wenn du die Dev-Tools drauf hast, dann hast du alles was du brauchst.

Dann halt unter OS X:

g++ prog.c -o prog -framework OpenGL -framework GLUT
 
Wenn ich ein Programm "main.c" mit g++ main.c -o prog -framework OpenGL -framework GLUT aufrufe,
kommt die Fehlermeldung:
/usr/lib/crt1.o illlegal reference to symbol: __objcInit defined in indirectly referenced dynamic library /usr/lib/libobjc.A.dylib

Nebenbei sei erwähnt: ich hab mir die ganzen h - files zusammengesucht, und nichts installiert, muß ich z.b. den SDK ordner noch irgendwo hinkopieren?
 
Du hast doch die Dev-Tools (XCode) installiert, oder? Dann hast du alles für OpenGL-Entwicklung mit GLUT. Du brauchst nichts mehr zu installieren. Du brauchst auch nix zu kopieren oder sonst was. Du musst nur die richtigen Compiler-Flags setzen.

Zu der Fehlermeldung. Sorry. Hatte ich vergessen.

Das muss so heißen:

g++ main.c -o prog -framework OpenGL -framework GLUT -Wl,/usr/lib/libobjc.A.dylib

P.S:

Ich würde aber auf XCode umsteigen. Über die Konsole wird es bei mehreren Dateien nachher ziemlich wirr. Auch wird das kompilieren komplizierter. Bei XCode nur ein klick...

In XCode ein neues Projekt erstellen. Als Art dann "C++-Tool" auswählen. Dann die Frameworks in die Framework-Liste einfügen und loslegen...
 
Also zunächst mal vielen Dank für deine große Hilfe!!!
Ich versuch seit langem den Kram zum Laufen zu kriegen.... :)

Also es läuft jetzt, nur nicht so, wie ich will (wer hätte das gedacht...)

Wenn ich z.B. ein einfaches Prog schreibe:

#include <gl.h>
#include <glut.h>


void display()
{
float zeit = 0.0;
while(zeit < 720.0)
{
glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
glRotatef(zeit,1,1,1);
glBegin(GL_POLYGON);
glVertex3f(0,0,0);
glVertex3f(0.5,0.5,0);
glVertex3f(1,0,0);
glEnd();
glPopMatrix();
glFlush();
glutSwapBuffers();
zeit += 1;
}
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GL_DOUBLE| GLUT_RGB);
//glEnable(GL_DEPTH_TEST);
glutCreateWindow("Geil Alder");
glutDisplayFunc(display);
glutMainLoop();
return 0;

}

müßte eigentlich ein tolles Dreieck erscheinen und sich dann drehen...
Erscheinen tut es, drehen aber nicht (Bildwiederneuaufbau???).

Wenn ich das glEnable(GL_DEPTH_TEST) reinmache, krieg ich nen Bus error und ne Meldung "Das Programm wurde unerwartet beendet".

Und wenn ich das glutInit(&argc,argv) rausmache krieg ich ne riesen Fehlermeldung beim Ausführen:
"prog[698] GLUT Fatal Error: internal error: NSInternalInconsistencyException, reason: Error (1002) creating CGSWindow"

Wobei ich mit dem Letzten noch leben könnte, wenn ichs einfach drinliese, aber was ist das mit dem glEnable und mit der nichtvorhandenen Animation?
 
Oh weh. Oh weh... ;)

OK. Ich fange mal an... ;)

Erst mal ist glutInit deine Fenster-Initialisierung. Ohne die läuft auch gar nix... ;) Dann machst du einen ziemlichen Fehler was den "Bildneuaufbau" betrifft.

Zum Verständnis:

Die sagst zwar das OpenGL das Bild als "fertig" bezeichnet und du sagst auch das (aufgrund des DoubleBuffer) das er das Bild im Framebuffer tauschen soll. Du sagst aber nirgendwo das GLUT sein Bild aktualisieren soll, d.h. den Framebuffer lesen soll. ;)

Das er bei glEnable abschmiert liegt bestimmt daran, das du es an einer falschen Stelle aufrufst.

Ich schreibe den Code mal so um:

Code:
#include <OpenGL/gl.h>
#include <GLUT/glut.h>

float zeit = 0.0;

void CalcNewModelPos()
{
	glLoadIdentity();
	glRotatef(zeit,1,1,1);
}

void display()
{
	glClearColor(0.0f,0.0f,0.0f,0.0);
	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

	if (zeit >= 720.0)
	{
		zeit = 0.0;
	}
	
	// Errechnen der neuen Modell-Positionen
	CalcNewModelPos();
	
	glBegin(GL_POLYGON);
		glVertex3f(0,0,0);
		glVertex3f(0.5,0.5,0);
		glVertex3f(1,0,0);
	glEnd();

	glutSwapBuffers();
	zeit += 1;
}

void myGLInit()
{
	//Z-Puffer aktivieren
	glDepthFunc(GL_LEQUAL);
	glEnable(GL_DEPTH_TEST);
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA);
	glutCreateWindow("Geil Alder");

	// Funktion für OpenGL-Anpassungen
	myGLInit();
	
	glutDisplayFunc(display);
	glutIdleFunc(display); // die Funktion display ist nun die "Schleife"
	glutMainLoop();
	return 0;
}

Wie gesagt. Durch das glutIdleFunc wird die Funktion "display" immer aufgerufen, so schnell es geht. Das heißt die Funktion display ist als Schleife zu betrachten.

Ansonsten habe ich noch einige Fenster-Initialisierungen erweitert und einiges in Funktionen ausgelagert. Das erhöht die Übersicht.

Wenn Fragen, dann frag. :)
 
Naja komm also soooooooo schlim war das ja dann doch nicht ;-)
Hab den glEnable(GL_DEPTH_TEST) nur eine Zeile zu früh aufgerufen...
Und das mit dem nichtvorhandenen Bildaufbau... naja.
Aber das mit der glutldleFunc() is ne gute Idee. Wobei es mit ner While auch gehen sollte... (zumindest hört man das von irgendwelchen Leuten, die jemanden kennen, der jemanden vor ganz ganz langer Zeit gekannt haben will, der das so immer unter Windows gemacht hat).

Ein paar Fragen hab ich aber noch (nur zum Verständnis):

Fürwas ist die glDepthFunc(GL_LEQUAL) und was bedeutet das macro?
Wieso benutzt du im Display Modus neben GLUT_RGBA und GLUT_DOUBLE auch GLUT_DEPTH und GLUT_ALPHA?
Wieso leerst du den Buffer nicht mit glFLush()?
Was ist eigentlich ein Framework?
Was bedeutet "-Wl,/usr/lib/libobjc.A.dylib"?

Und dann hab ich auch nochmal mim Xcode probiert:
Ich wähle empty Project, nehm ne neue File ("C File") dazu die beiden Frameworks (GLUT,OpenGL)... - und dann???
Da war doch noch was mit nem Target, oder? Weil compilieren läßt sich nicht.
 
Zurück
Oben Unten