Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.06.2010, 21:10

probleme beim Rendern mit OGL

hallo.

so ich hab jetzt ein anderes problem, dass ich nicht so ganz lösen kann.
es is so, ich hab eine klasse die mein programm startet und opengl initialisiert.
und ich hab eine weitere klasse die meine render methode is.
in der zeichne ich dann mit glBegin() und End() meine vektoren.

Das problem is jetzt, dass die GLUT funktion: glutDisplayFunc
offenbar eine static funktion erwartet

jetzt will ich aber in der render methode einfach mal meine objekte rotieren aber da bekomm i immer folgende errors:
render.h:16: error: invalid use of member ‘CRender::rotx’ in static member function
render.cpp:35: error: from this location


so schaut der code aus in der ich meine render methode aufrufe... wie kann ich denn dieses problem lösen?

CRender render;
glutDisplayFunc(render.render);
glutMainLoop();


lg

2

30.06.2010, 21:35

Hm, rotx is doch ne Membervariable von CRenderer, oder?
Du kannst nicht einfach Membervarialben in ner Statischen Memberfunkion verändern !

3

30.06.2010, 21:49

ja ich weiß.
das is das problem. wie soll ich das sonst angehn? wenn
ich render() nicht statisch mach bekomm i folgende meldung :
error: argument of type ‘void (CRender::)()’ does not match ‘void (*)()’


und dann könnt i ja problemlos meine membervars ändern, aber
wie gesagt i kanns nur kompilieren wenn i dievon glDisplayFunc funktion static is...

ps: i = ich

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

4

30.06.2010, 22:20

Du kannst keine Memberfunktionen einfach so als callback an glut übergeben. Alternativ könntest du aber eine statische funktion als callback nehmen und auf eine globale instanz deines renderers zugreifen.
In etwa so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class Renderer {
static Renderer* static_instance;
static void RenderCallback() { Renderer::static_instance->Render(); }
void Render() {
// Hider der Render Code
}
Renderer() {
static_instance = this;
glutDisplayFunc(Renderer::Render);
}
}


Eine andere alternative wäre boost::bind zu verwenden.

5

30.06.2010, 22:31

habs mal mit deiner variante probiert.

da bekomm i leider beim linken an fehler:
render.cpp:(.text+0x5a): undefined reference to `CRender::static_instance'
render.o: In function `CRender::RenderCallback()':

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »AlymcGeel« (30.06.2010, 22:46)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

01.07.2010, 00:21

Da die GLUT Callbacks keine Möglichkeit bieten einen Userpointer zu übergeben wird das eher schwierig werden. Ich würd aber sowieso von GLUT abraten da es schon ziemlich alt und vor allem mit C++ nicht wirklich kompatibel ist (gibt keinen Weg um aus glutMainLoop() zurückzukehren). Alternativen wären z.B. freeglut oder GLFW.

7

01.07.2010, 10:27

Ich benutze auch GLFW und bin damit ganz zufrieden. Vor allen Dingen, weil man damit nicht unbedingt so komische Callbackfunktionen benutzen muss.
Lieber dumm fragen, als dumm bleiben!

8

01.07.2010, 11:41

achso... ok..
naja dot, ich lies nur grad das vo buch zu cg1/2 und da is halt glut verwendet... dann werd ich mich mal mit GLFW vertraut machen...

danke. lg

9

01.07.2010, 15:20

So habs jetzt mit GLFW gemacht und es funktioniert wunderbar

danke für eure hilfe...

Werbeanzeige