Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shaderprogramme mit gcc unter Suse Linux 10



karx11erx
18-11-2005, 14:58
Hallo,

ich versuche gerade, ein Programm unter Linux zum laufen zu bringen, das Shaderprogramme verwendet. Die Prototypen für die zug. Funktionen gibt es auch - ich weiß nur nicht, welche Bibliothek die Funktionen enthält.

Ich gebe gcc beim Linken die Parameter -lGL und -lGLU mit, das reicht aber nicht.

Was muss ich tun, damit ich die Shader-Erweiterungen gelinkt bekomme?

Die Funktionen heißen z.B. glCreateShaderObjectARB, glCompileShaderARB, usw.

karx11erx

Yonibear
19-11-2005, 12:30
Mit den Extensions unter OpenGL ist das immer etwas kompliziert, da diese nicht direkt in der libGL.so enthalten sein dürfen. Um das zu umgehen hast du 3 Möglichkeiten:

1.) Man erstellt einen Funktionspointer auf die entsprechenden Aufrufe und weist ihn bei der Initialisierung zu. Der Befehl ist vom verwendeten Toolkit abhängig, zb. bei SDL SDL_GL_GetProcAdress.

2.) Du benutzt eine Bibliothek, die das gleich automatisch für dich macht, zum Beispiel die GLEW (http://glew.sourceforge.net) .

3.) Du verwendest Funktionen die bereits im Standard enthalten sind, zb. kannst du statt glCreateShaderObjectARB glCreateShader verwenden, welches in OpenGL 2.0 enthalten ist. Das hat aber 2 Nachteile: Da unter Windows die libopengl32.a immer noch nur den OpenGL 1.1 Standard enthält, bist du auf Linux festgenagelt, wenn du nicht zusätzlich die GLEW verwendest. Weiterhin funktioniert das Ganze mit den Kernfunktionen etwas anders als mit der ARB-Extension, daher ist etwas Umschreibarbeit nötig.

karx11erx
19-11-2005, 13:47
Vielen Dank für die Antwort. Wenn ich die Funktionspointer-Geschichte mache, muss ich mich doch auf irgendwas beziehen, oder? Unter Windows lade ich eine DLL und hole mir die Funktionen so, aber unter Linux? Könntest Du das genauer ausführen?

Ich werde mir auf jeden Fall die OpenGL 2.0-Funktionen auch ansehen. Ich habe sowieso alles in einen Windows- und einen Linux-Code-Zweig aufgeteilt, da sollte ich nicht allzu große Schwierigkeiten haben.

Yonibear
19-11-2005, 13:55
Ich hab mich mit der Funktionspointergeschichte nicht weiter beschäftigt, daher hab ich davon auch leider nicht besonders viel Ahnung. Ein gutes Beispiel wie sowas funktioniert, findest du aber in folgendem Tutorial:
http://resourcecode.de/view.php?id=2164

Dort wird mit Funktionspointern gearbeitet, die eben mit SDL_GL_GetProcAdress geholt werden.

karx11erx
19-11-2005, 21:19
Vielen Dank. Mit OpenGL 2.0 muss ich doch im Grunde einfach nur das Suffix 'ARB' von allen entspr. Funktionsnamen weglassen, wenn ich Dich richtig verstanden habe. Einfacher geht's ja nicht mehr. :)

Du sagst, beim Aufruf der Kernfunktionen wäre u.U. was zu ändern? Bei welcher z.B.? Ich habe ein paar verglichen, konnte aber keine Unterschiede feststellen.

Die Funktionspointer-Geschichte ist übrigens sehr einfach, es wird allerdings die Verwendung der SDL vorausgesetzt. Man muß die F-Pointer passend deklarieren und dann die F-Adressen per SDL_GL_GetProcAddress() laden. Unter Windows nimmt man stattdesssen wglGetProcAddress, also reicht es für mich, das umzudefinieren, falls ich diese Mimik verwenden will.

Yonibear
19-11-2005, 23:16
Ich meinte mich zu erinnern, dass zb. glCreateShaderObjectARB ein glHandle, glCreateShader aber ein GLuint zurückgibt. Hab nochmal nachgeschaut, das ist per typedef beides ein unsigned int, anscheinend wurden die ARB-Extensions wirklich 1:1 in den Standard übernommen.

Aber warum meinst du, dass man unter Windows wglGetProcAddress verwenden müsse? Ich dachte immer, SDL_GL_GetProcAddress ist einfach eine Wrapperfunktion, die unter Win32 wglGetProcAdress und unter X11 glXGetProcAdress aufruft. Mit diesen Funktionen solltest du das dann auch per Hand machen können, wenn du SDL nicht verwenden magst,

karx11erx
20-11-2005, 08:26
Ich kenne keine andere Methode unter Windows, als die Funktionen per F-Pointer anzusprechen und die per GetProcAddress zu initialisieren. Statisch linken schien mir nicht zu gehen (ist ja eine System-DLL). Die Link-Lib zur DLL habe/finde ich jedenfalls nicht.

karx11erx
21-11-2005, 10:20
Tja, so ein Pech: Der Linker kennt die OpenGL 2.0-Funktionen nicht - was mache ich jetzt? Und wieso kennt er die nicht? Ich dachte, unter Linux habe ich OpenGL 2.0?

Giuly
23-11-2005, 22:43
Tja, so ein Pech: Der Linker kennt die OpenGL 2.0-Funktionen nicht - was mache ich jetzt? Und wieso kennt er die nicht? Ich dachte, unter Linux habe ich OpenGL 2.0?
Sicher? Lass mal glxgears laufen. Sonst versuch mal

-lGLcore -lGLw -lGLU -lGL

MfG

karx11erx
24-11-2005, 14:27
Vielen Dank, giuly - ich wußte schlicht nicht, wie die libs heissen. :)

Edit: GLcore gibts bei mir nicht. In /usr/lib gibt es libGLcore.so.1 und libGLcore.so.1.0.7676 (keine libGLcore.la und keine libGLcore.so), aber das reicht meinem configure-script bei der Suche nach den GL-Libs nicht.

Giuly
24-11-2005, 22:49
Vielen Dank, giuly - ich wußte schlicht nicht, wie die libs heissen. :)

Edit: GLcore gibts bei mir nicht. In /usr/lib gibt es libGLcore.so.1 und libGLcore.so.1.0.7676 (keine libGLcore.la und keine libGLcore.so), aber das reicht meinem configure-script bei der Suche nach den GL-Libs nicht.
Versuch mal GLcore wegzulassen, sollte dann gehen.

karx11erx
25-11-2005, 11:57
Probiere ich, danke.

Yonibear
27-11-2005, 16:13
Sehr seltsam, bei mir reicht das linken mit -lGL , dafür gibt es GLw nicht. Ich glaube auch nicht dass das der richtige Weg sein soll. Vielleicht wäre es doch sinnvoller, auch unter Linux mit F-Pointern zu arbeiten, was ohnehin die Unterschiede zum Win32-Code verringern würde.

karx11erx
28-11-2005, 12:07
GLw gibt es bei mir auch nicht, und ich muß die *ARB-Funktionen per SDL_GetProcAddress() einbinden - linken der OpenGL 2.0-Funktionen tutet nicht.