Problem mit OpenGL und Windowsversionen ungleich Windows 7
-
Ich habe ein Spiel mit OpenGL-Grafik programmiert. Auf meinem Laptop(mit Windows 7) funktioniert es problemlos. Auf anderen Windows 7 PC´s auch. Doch bei älteren Windowsversionen wird das Bild mittendrin nicht mehr aktualisiert. Zufällig fügte ich in die Zeichen-Funktion noch das Zeichnen eines Quadrats hinzu und plötzlich ging es. Ich hab aber keine Ahnung wieso. Kennt jemand die Lösung?
Hier der Code://Zeichnen-Funktion:
void Zeichnen(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
for(int i=0;i<16;i++){
if(SpielerSpielt[i]){
spieler[i]->zeichnen();
}
}
glBegin(GL_QUADS); //von hier...
glVertex3f( a,0.0f,20.0f);
glVertex3f(a+10,0.0f,20.0f);
glVertex3f(a+10, 10,20.0f);
glVertex3f( a, 10,20.0f);
glEnd(); //...bis hier ist das oben angesprochene Quadrat
a+=0.1;
SwapBuffers(GLhDC);
}//Zeichnen der einzelnen Spieler (hab ich zur Problemlösung nicht geändert)
void Spieler::zeichnen(){
int i;
glLoadIdentity();
glColor3f(Farbe[0],Farbe[1],Farbe[2]); //Farbe des Spielers
for(i=0;i<=zg;i++){//Geraden zeichnen
glTranslatef(g[i].x,g[i].y,0.0f); //zum Nullpunkt des Geradenstücks bewegen
glRotatef(g[i].al,0.0f,0.0f,-1.0f);//um Winkel al drehen
glBegin(GL_QUADS); //Gerade zeichnen
glVertex3f( 0.0f,0.0f,0.0f);
glVertex3f(g[i].l,0.0f,0.0f);
glVertex3f(g[i].l, b,0.0f);
glVertex3f( 0.0f, b,0.0f);
glEnd();
glLoadIdentity();
}
for(i=0;i<=zk;i++){ /Kurven zeichnen glTranslatef(k[i].x,k[i].y,0.0f); //zum Mittelpunkt bewegen gluPartialDisk(ObjKurve,r,R,32,1,k[i].al,k[i].sw); //Kurvenstück zeichnen glLoadIdentity();
}
if(ProgrammPos==12 && (zLücke<=Lückengröße || zLücke>(Lückenabstand-b))){ //Viereck zum besseren Erkennen bei Lücke
glTranslatef(xkol1,ykol1,0.0f); if(mR){ //Viereck für Rechtskurve
glRotatef(k[zk].al+k[zk].sw+180,0.0f,0.0f,-1.0f);
glBegin(GL_QUADS);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f( b,0.0f,0.0f);
glVertex3f( b, b,0.0f);
glVertex3f(0.0f, b,0.0f);
glEnd();
}
else if(mL){ glRotatef(k[zk].al+k[zk].sw+90,0.0f,0.0f,-1.0f);//Viereck für Linkskurve
glBegin(GL_QUADS);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f( b,0.0f,0.0f);
glVertex3f( b, b,0.0f);
glVertex3f(0.0f, b,0.0f);
glEnd();
}
else{ //Viereck für Gerade
glRotatef(g[zg].al,0.0f,0.0f,-1.0f);
glBegin(GL_QUADS);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f, b,0.0f);
glVertex3f(-b , b,0.0f);
glVertex3f(-b ,0.0f,0.0f);
glEnd();
}
}
}
Danke schon im Voraus
-
Alter, benutz mal Codetags. Habe schon direkt kein Bock mehr mir das durchzulesen.
-
Sorry, bin neu in diesem Forum, also auch mit dem ganzen zeug noch nicht vertraut
-
//Zeichnen-Funktion: void Zeichnen(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); for(int i=0;i<16;i++){ if(SpielerSpielt[i]){ spieler[i]->zeichnen(); } } glBegin(GL_QUADS); //von hier... glVertex3f( a,0.0f,20.0f); glVertex3f(a+10,0.0f,20.0f); glVertex3f(a+10, 10,20.0f); glVertex3f( a, 10,20.0f); glEnd(); //...bis hier ist das oben angesprochene Quadrat a+=0.1; SwapBuffers(GLhDC); } //Zeichnen der einzelnen Spieler (hab ich zur Problemlösung nicht geändert) void Spieler::zeichnen(){ int i; glLoadIdentity(); glColor3f(Farbe[0],Farbe[1],Farbe[2]); //Farbe des Spielers for(i=0;i<=zg;i++){//Geraden zeichnen glTranslatef(g[i].x,g[i].y,0.0f); //zum Nullpunkt des Geradenstücks bewegen glRotatef(g[i].al,0.0f,0.0f,-1.0f);//um Winkel al drehen glBegin(GL_QUADS); //Gerade zeichnen glVertex3f( 0.0f,0.0f,0.0f); glVertex3f(g[i].l,0.0f,0.0f); glVertex3f(g[i].l, b,0.0f); glVertex3f( 0.0f, b,0.0f); glEnd(); glLoadIdentity(); } for(i=0;i<=zk;i++){ /Kurven zeichnen glTranslatef(k[i].x,k[i].y,0.0f); //zum Mittelpunkt bewegen gluPartialDisk(ObjKurve,r,R,32,1,k[i].al,k[i].sw); //Kurvenstück zeichnen glLoadIdentity(); } if(ProgrammPos==12 && (zLücke<=Lückengröße || zLücke>(Lückenabstand-b))){ //Viereck zum besseren Erkennen bei Lücke glTranslatef(xkol1,ykol1,0.0f); if(mR){ //Viereck für Rechtskurve glRotatef(k[zk].al+k[zk].sw+180,0.0f,0.0f,-1.0f); glBegin(GL_QUADS); glVertex3f(0.0f,0.0f,0.0f); glVertex3f( b,0.0f,0.0f); glVertex3f( b, b,0.0f); glVertex3f(0.0f, b,0.0f); glEnd(); } else if(mL){ glRotatef(k[zk].al+k[zk].sw+90,0.0f,0.0f,-1.0f);//Viereck für Linkskurve glBegin(GL_QUADS); glVertex3f(0.0f,0.0f,0.0f); glVertex3f( b,0.0f,0.0f); glVertex3f( b, b,0.0f); glVertex3f(0.0f, b,0.0f); glEnd(); } else{ //Viereck für Gerade glRotatef(g[zg].al,0.0f,0.0f,-1.0f); glBegin(GL_QUADS); glVertex3f(0.0f,0.0f,0.0f); glVertex3f(0.0f, b,0.0f); glVertex3f(-b , b,0.0f); glVertex3f(-b ,0.0f,0.0f); glEnd(); } } }
@Kóyaánasqatsi
Alter, sei mal freundlicher... Habe schon direkt kein Bock mehr mir das durchzulesen.
-
@Scorcher24: dadurch ist es jetzt auch nicht viel besser geworden
-
Danke dafür, dass jetzt alles in schöner Form dasteht
.
Nur bin ich jetzt noch verwirrter, da ich bemerkte, dass ich mit dem Einfügen des Quadrats nur erreicht habe, dass es manchmal funktioniert und manchmal funktoniert es doch nicht.
-
Senfti schrieb:
Danke dafür, dass jetzt alles in schöner Form dasteht
.
Nur bin ich jetzt noch verwirrter, da ich bemerkte, dass ich mit dem Einfügen des Quadrats nur erreicht habe, dass es manchmal funktioniert und manchmal funktoniert es doch nicht.Ja nur aus dem Code das jetzt rausfinden ist nicht trivial :P. Wie die anderen beiden sagten, der ist nicht einfach zu lesen. Mach mal das Quadrat raus und mach am Ende jeden Frames eine Fehlerabfrage mit glGetError. Und logg die Ausgabe irgendwie. Sample aus meinem Code:
u32 err = glGetError(); while (err != GL_NO_ERROR && err != m_prevGLError) { m_prevGLError = err; std::stringstream ss; ss << "[OpenGL] " << gluErrorString(err); NLError(ss.str().c_str()); err = glGetError(); }
Tauchen da Fehler auf?
rya.
-
Ich habe jetzt das Quadrat weggelassen und stattdessen das mit glGetError() gemacht und es hat ohne irgendein Problem, weder einem Fehler von glGetError noch dem Stehenbleiben, funktioniert.
Daraufhin habe ich die Fehlerabfrage weggelassen und schon war mein altes Problem wieder da.Nochmal zum Problem: Ich lasse in meinem Programm ein Quadrat erscheinen und nach 50 Frames ein zweites, und so weiter bis zu maximal 16. Nach weiteren 50 Frames verändere ich 2 Punkte jedes Quadrats, damit es zu einem Rechteck wird, welches sich immer mehr in eine Richtung vergrößert (in jedem Frame ein bisschen). Also es sieht so aus wie immer länger werdende Linien . Der Frame nach dem ersten Mal länger werden wird noch gezeichnet, aber danach wird das Bild nicht mehr aktualisiert.
Ich habe mein OpenGL-Fenster als Childfenster in einem normalen Windows-Fenster.Vor allem verwirrt mich, dass scheinbar das Einfügen irgendeiner Anweisung zwischen dem Aufrufen der Funktion mit dem ganzen Zeichnenkram und dem SwapBuffers das Problem behebt.
-
Das is aus Deinem Code so leider nicht nachvollziehbar warum das so passiert. Es gibt zu jedem begin() ein end() etc. Kanns nicht sagen. Was für nen Context hast Du denn? Einen 3.x Compability Layer? Kann evtl. daran liegen, denn glBegin() und end() sind deprecated. Aber das is nur geraten. An sich ist dieses Verhalten komisch. Nutzt Du vllt Threads?
rya.
-
(Sorry für Offtopic)
hustbaer schrieb:
@Scorcher24: dadurch ist es jetzt auch nicht viel besser geworden
Notiz an Scorcher24: Nächstes Mal auf "Zitieren" klicken, unter Umständen ist da die Formatierung noch erhalten.
-
Ich schreibe meine OpenGL-Programme nach Vorlage des NeHe-Tutorials (ich weiß, es ist veraltet, aber sonst hat es immer wunderbar funktioniert). Threads nutze ich nicht.
Mir wird wohl nichts anderes übrigbleiben als irgendeine sinnlose Anweisung, die keiner bemerkt, drinnen zu lassen und zu hoffen, dass mir dieses Probelm nicht wieder unterkommt.