| Autor |
Beitrag |
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Fr 11.03.05 15:55
Also die glBitmap zu benutzen sollte recht einfach sein. Wenn nicht frag mich ein fach, dann erkläre ich dir was ich mir dabei gedacht habe.
Zu dem alten Rechner. Du kannst ja mal spaßeshalber Probieren ob meine Testanwendung auf ihm funktioniert. Wenn ja, dann solltest du dich da ein wenig daran orientieren.
Was ich gerade gesehen habe. Streck mal bitte deine Finger vor!! *rohrstockraushohl*
In deiner Displayliste in der du die Welt zeichnest lädst du Texturen und gibst sie am Ende wieder frei. SO ETWAS MACHT MAN NICHT! Aber absolut nicht. Lade sie beim Starten benutze sie in der Liste und gibt sie am Ende des Programms wieder frei. Zusätzlich dazu hast du außen um die Liste eine Matrix gepushed und gepoped. Das solltest du entweder innen drin machen oder es lassen.
gluPerspective: Wie du in meinem Beispiel siehst mache ich das ausschlißlich nur zu Begin und falls sich das Fenster in der Größe ändern sollte.
Thread: Das bringt nichts. Timer.Create erstellt keinen Thread und außerdem steht seine Prio auf Idle. Er würde nicht ausgeführt werden, da die Renderschleife (die du in Application.OnIdle verwandeln solltest) 100% (Prio Normal) der CPU verbrät. Somit fängt der Thread an und bleibst augenblicklich stehen.
INVALIF_OPERATION: In deiner Welt, bei den Wänden hast du als letztes ein glEnd vergessen. Sonst sieht alles gerenderte soweit okay aus.
Fazit: Wenn du mich fragst, dann solltest das Projekt einstampfen und von Grund auf neu anfangen! Es bringt ja jetzt nichts, wenn du versucht es mit allen mitteln zum Laufen zu bewegen. Dadurch wird alles nur schlimmer wie du ja an der Tatsache siehst, dass der ältere Rechner schon gleich aussteigt. Nimm dir ein leeres Projekt, Initialisieren OpenGL dort richtig und versuche das auf das Minimum zu beschränken. Am Besten wird es sein wenn du dir meinen Code mal genau anschaust. Wenn du ein Funktionierendes OpenGL hast, dann (und nur dann) kannst du dich daran machen deine Welt zu implementieren. Dabei kannst du ja wieder auf bereits geschrieben Code zurückgreifen. Nur schmeiß deine Initialisierung weg. Das bringt echt nichts.
Erasebackground: Jain. Bei mir das Mehodengerüst so aus. Aber der Inhalt stimmt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| protected procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; end;
...
procedure TForm1.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin Message.Result := Integer(true); end; |
[edit] Den Fehler hatte ich auch mal. Ich hatte aber noch 3 oder 4 andere Fehler. Das ist mir alles absolut nicht gehäuer. Siehe Fazit.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Sa 12.03.05 12:26
Wie das Methodengerüst aussieht weiß ich, nur ich im letzten Post einen Fehler drinnen hatte lag daran, dass ich momentan immer von der Uni-Bibo aus schreibe (wir bekommen endlich bald zu Hause Internet) und dadurch den Quelltext nicht ausprobieren kann (war ja nur der Fehler dass ich TWM_ERASEBKGND statt TWMERASEBKGND geschrieben hatte). Ich wusste nur nicht, dass es Integer(true) gibt (muss mir von Delphi mal auswerten lassen, was der Rückgabewert dieser Funktion ist).
Dein Vorschlag, dein Programm auf meinem alten Rechner auszuprobieren, brauch ich erst gar nicht versuchen, da der Rechner mit der dglOpenGl.pas nicht glarkommt (die Grafikkartenim Rechner sind ja schließlich auch schon 7 Jahre alt; 2D-Grafikkarte: 2 MB-RAM; 3D-Grafikarte: 4 MB-RAM, aber Treiber oder Karte defekt).
Danke für den Hinweis, dass ich im Timer_Thread noch die Prio auf Idle stehen habe. Ich habe beim ausprobieren auf Idle gestellt gehabt, da der Thread zum Anfang für eine CPU-Auslastung von 100% gesorgt hatte (auf einen 3200er!!!), da ich sleep vergessen hatte.
|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: Sa 12.03.05 18:00
Nur um es zu klarzustellen, falls es wirklich so gemeint war (wenn nicht, ignoriere mich  )
Die Header selbst laufen auch auf alten Rechnern und sind vollwertig mit den alten. Sofern die Treiber der Grafikkarte OpenGL unterstützen, lassen sich die Header einsetzen (bzw. problemfrei). Nur halt mit den Features, die die Grafikkarte dann auch wirklich drauf hat. OpenGL 1.5 Features werden entsprechend wohl eher nicht von der Grafikkarte unterstützt werden 
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Mo 14.03.05 15:44
@Lossy eX: Dein Programm funktioniert ja wirklich auf meinem alten Rechner  (auch wenns hackt). Als ich es mit der dglOpenGl.pas ausprobiert habe, kam immer eine Fehlermeldung (dabei hatte ich, von einem funktionierendes Programm, nur die OpenGl12.pas gegen die dglOpenGl.pas getauscht).
Ach, du hattest doch über das Grundgerüst gemeckert. Das Grundgerüst hatte ich weitestgehend von diesem Tutorial. Einen kleinen Teil hatte ich auch mir aus irgendein ein Download von www.delphigl.com genommen, von dem ich auch den Anfang der Zeichenprozedur genommen hatte. Ich muss zugeben, dass dein Grunderüst ganz anders dagegen aussieht. Ich werde dein Grundgerüst die nächsten Tage mal ausprobieren. Ich werde dabei auch mal deinen Texturenloader ausprobieren (konnte ich letztesmal nicht mitnehmen, da ich kein Speichermedium mithatte  ).
Der Fehler Invalid_Operator entstand wirklich nur duch das fehlende glEnd  (das einfachste übersieht man wieder mal).
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 14.03.05 16:16
| Zitat: | Dein Programm funktioniert ja wirklich auf meinem alten Rechner (auch wenns hackt). |
Dann habe ich ja doch was richtig gemacht.
Aber das Hacken dürfte am nicht (oder kaum) vorhandenen OpenGL liegen. Wobei da ja effektiv nur ein QUAD da war. Also wohl eher am nicht vorhandenen.
| Zitat: | | Als ich es mit der dglOpenGl.pas ausprobiert habe, kam immer eine Fehlermeldung (dabei hatte ich, von einem funktionierendes Programm, nur die OpenGl12.pas gegen die dglOpenGl.pas getauscht). |
Ja. Das ist ja auch logisch. Du musst zusätzlich noch die Methoden ReadExtensions und ReadImplementedProperties aufrufen. Und zwar nachdem du OpenGL erstellt hast und bevor du einen OpenGL Aufruf tätigst. Oder du benutzt die Hilfsfunktion ActivateRenderContext.
| Zitat: | | Ach, du hattest doch über das Grundgerüst gemeckert. |
Du hattest dort an den verschiedensten Stellen versucht zu renden und teilweise hat man gesehen, dass du so 3-4 verschiedene Rendermethoden ausprobiert hattest. Die hattest du dann aber nicht wieder sauber entfernt. Dadurch kommt wohl auch das Problem mit dem Flackern.
| Zitat: | Ich muss zugeben, dass dein Grunderüst ganz anders dagegen aussieht. Ich werde dein Grundgerüst die nächsten Tage mal ausprobieren. Ich werde dabei auch mal deinen Texturenloader ausprobieren (konnte ich letztesmal nicht mitnehmen, da ich kein Speichermedium mithatte ). |
Ja. Im Endeffekt das ist das Gerüst ja immer relativ gleich. Und ich kopiere das immer nur von Anwendung zu Anwendung. Zum Thema Loader. Falls fragen sein sollen. Stell sie. Aber das sollte alles recht selbsterklärend sein. Ist von der Namen ein wenig an der glBMP angelehnt. Halt nur besser. 
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Sa 09.04.05 19:31
Ich habe jetzt endlich mal die Zeit gefunden dein Grundgerüst auszuprobieren. Aber irgendwie bekomme ich das nicht hin. Dabei habe ich schon auf Texturen verzichtet. Ich bekomme wieder so eine schöne Fehlermeldung: 'invalid value'. Diesmal habe ich schon geguckt ob ich ein glEnd vergessen habe, was aber nicht der Fall ist. Der hat scheinbar ein Problem mit der Weltgl-List (meiner Meinung nach ohne Grund  ).
Hinweis: Der Thread der dabei liegt ist noch eingebunden (wird also nicht verwendet). Ein paar Variablen daraus werden aber verwendet, weshalb die schon eingebunden ist.
PS: Der Grafikfehler scheint bei der Version mit Opengl12.pas nicht mehr zu existieren. Das Programm funzt trotzdem nicht auf meinem alten Rechner.
Einloggen, um Attachments anzusehen!
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 11.04.05 08:04
Ne Ne. Invalid Value solltest du nur bekommen wenn du an eine Methode einen ungültigen Wert übergibst. Durch auskommentieren konnte ich den Fehler sehr schnell finden. Wo erzeugst du eigentlich deine Liste Weltgl? Also nicht glNewLists. Damit wird sie ja nur gefüllt. Ich habe nirgends einen Aufruf von glGenLists gefunden.
Als ich das mal hinzugefügt hatte trat der Fehler nicht mehr auf und es war ein weißer Bereich zu sehen.
Warum das auf deinem alten Rechner nicht funzt kann ich dir nicht sagen. Normal sollte es sogar auf der Microsoft Softwareimplementation von OpenGL 1.1 gehen, da du ja auch nur ganz fundamentale Befehle benutzt. Evtl wäre es auch ganz interesannt mal den Report von dem GLinfo zu sehen. Den einfach mal speichern und hier mit anhängen.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Mo 11.04.05 16:00
Das glGenList hatte ich glatt vergessen beim übernehmen, da ich mein Grundgerüst kaum noch angeguckt hatte.
Im Anhang die geforderten Ergebnisse (die vom neuen Rechner habe ich mal als Vergleich dazugetan).
Einloggen, um Attachments anzusehen!
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 12.04.05 07:53
Aha. Wie es fast vermutet hatte läuft deine Karte in Software (Microsoft als OpenGL Vendor). Und deren OpenGL ist das absolut letzte was es gibt. Langsam Buggy etc. Die werden da aber auch definitiv nichts mehr dran ändern. Ist ja klar. Die wollen ja Direct3D vorrantreiben. Also kannst du es jetzt entweder so lassen oder wenn du unbedingt eine Softwareimplementation haben willst, dann würde ich Mesa3D empfehlen. Allerdings kann ich dir nicht sagen wie man aus dem riesen Sourcecodepacket eine DLL bekommt.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Mi 13.04.05 17:29
Jatzt habe ich auch noch ein Problem mit eurem Texturenloader. Im OnShow-Ereignis habe ich glEnable(gl_Texture_2d); hinzugefügt und die Welt zum dem umgeändert.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88:
| procedure WeltGlLoad; var WandTex: TglBitmap2D; BodenTex: TglBitmap2D; DeckeTex: TglBitmap2D; begin glMatrixMode(GL_MODELVIEW); glNewList(Weltgl, GL_COMPILE);
WandTex:=TglBitmap2D.Create('Wand.jpg'); BodenTex:=TglBitmap2D.Create('Boden.jpg'); DeckeTex:=TglBitmap2D.Create('Decke.jpg');
WandTex.GenTexture; BodenTex.GenTexture; DeckeTex.GenTexture;
BodenTex.Bind; glColor3f(1,1,1); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glBegin(GL_QUADS); glTexCoord2f(80,80); glVertex3f(-40.000, 0.000,- 40.000); glTexCoord2f(80, 0); glVertex3f(-40.000, 0.000, 0.000); glTexCoord2f( 0, 0); glVertex3f( 0.000, 0.000, 0.000); glTexCoord2f( 0,80); glVertex3f( 0.000, 0.000,- 40.000); glEnd; DeckeTex.Bind; glBegin(GL_QUADS); glTexCoord2f( 0,80); glVertex3f( 0.000, Geschosshoehe,- 40.000); glTexCoord2f( 0, 0); glVertex3f( 0.000, Geschosshoehe, 0.000); glTexCoord2f(80, 0); glVertex3f(-40.000, Geschosshoehe, 0.000); glTexCoord2f(80,80); glVertex3f(-40.000, Geschosshoehe,- 40.000); glEnd; WandTex.Bind; glBegin(GL_QUADS); Wand(-40.000,-40.000, 0.000,-40.000); Wand( 0.000, 0.000,-40.000, 0.000); Wand(-40.000, 00.000,-40.000,-40.000); Wand( 0.000,-40.000, 0.000, 0.000); Wand(-15.800,-40.000,-15.800,-20.000); Wand(-15.500,-19.500,-15.500,-40.000); Wand(-15.800,-20.000,-17.800,-20.000); Wand(-17.800,-19.500,-15.500,-19.500); Tuer(-17.800,-20.000,-18.800,-20.000); Tuer(-18.800,-19.500,-17.800,-19.500); WaagerechteQuadrDecke(-18.800,-20.000,-17.800,-19.500, Tuerhoehe); TuerSeiten(-17.800,-20.000,-17.800,-19.500); TuerSeiten(-18.800,-19.500,-18.800,-20.000); Wand(-18.800,-20.000,-40.000,-20.000); Wand(-40.000,-19.500,-18.800,-19.500);
Wand(-12.000,-16.000,-40.000,-16.000); Wand(-40.000,-15.500,-12.000,-15.500); Tuer(-11.000,-16.000,-12.000,-16.000); Tuer(-12.000,-15.500,-11.000,-15.500); WaagerechteQuadrDecke(-12.000,-16.000,-11.000,-15.500,Tuerhoehe); TuerSeiten(-12.000,-15.500,-12.000,-16.000); TuerSeiten(-11.000,-16.000,-11.000,-15.500); Wand(- 9.000,-16.000,-11.000,-16.000); Wand(-11.000,-15.500,- 9.000,-15.500);
Tuer(- 8.000,-16.000,- 9.000,-16.000); Tuer(- 9.000,-15.500,- 8.000,-15.500); WaagerechteQuadrDecke(- 8.000,-15.500,- 9.000,-16.000,Tuerhoehe); TuerSeiten(- 9.000,-15.500,- 9.000,-16.000); TuerSeiten(- 8.000,-16.000,- 8.000,-15.500); Wand( 0.000,-16.000,- 8.000,-16.000); Wand(- 8.000,-15.500, 0.000,-15.500); Wand(-10.100,-15.500,-10.100, 0.000); Wand(- 9.900, 0.000,- 9.900,-15.500);
Wand(-19.500,-16.000,-19.500,-17.250); Wand(-19.700,-17.250,-19.700,-16.000); Tuer(-19.500,-17.250,-19.500,-18.250); Tuer(-19.700,-18.250,-19.700,-17.250); WaagerechteQuadrDecke(-19.500,-17.250,-19.700,-18.250,Tuerhoehe); TuerSeiten(-19.500,-17.250,-19.700,-17.250); TuerSeiten(-19.700,-18.250,-19.500,-18.250); Wand(-19.500,-18.250,-19.500,-19.500); Wand(-19.700,-19.550,-19.700,-18.250);
glEnd; glEndList; WandTex.Free; BodenTex.Free; DeckeTex.Free; end; |
Ich bekomme hier aber wiedereinmal "invalid value" zurückgegeben, obwohl mir Steffen schon den Hinweis mit GenTexture gegeben hat(Steffen hat mit geschrieben, da ich das Problem schon in die Seite, wo es die glBitmap gibt, geschrieben hatte.)
Moderiert von raziel: Delphi-Tags hinzugefügt.
EDIT: wollte ich gerade auch nachfügen 
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 14.04.05 10:12
Deine Sätze sind ein wenig wirr.
Zu der 'Invalid Value'. Hast du auch an das glGenLists gedacht, was ich erwähnt hatte? Sieht in dem Code nicht so aus.
Abgesehen davon macht du unten einen ziemlich groben Fehler. Und zwar erzeugst du die Texturen in der DisplayListe. Das solltest du nach Möglichkeit nicht tun.
In einer Displayliste werden alle OpenGLFehler mit ihren Parametern gespeichert und ausgeführt. Im Falle der Texturen würde es entsprechend so aussehen, dass OpenGL ein glGenTextures(1) bekommt und anschließend ein glTexImage2D auf die zu begin erstellte Textur. Würde also bedeuten, dass du bei jedem Rendervorgang 3 nicht benutze Textur erstellst (Und nicht wieder frei gibst) und bereits geladenen Daten noch einmal in die 3 Anfänglichen Texturen sendest.
Richtig sollte es so aussehen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| WandTex:=TglBitmap2D.Create('Wand.jpg'); BodenTex:=TglBitmap2D.Create('Boden.jpg'); DeckeTex:=TglBitmap2D.Create('Decke.jpg');
WandTex.GenTexture; BodenTex.GenTexture; DeckeTex.GenTexture;
WeltGL := glGenLists (1); glNewList(Weltgl, GL_COMPILE); |
PS: Nur mal was recht unwichtiges am Rande was mir gerade noch aufgefallen ist. Auf einigen Grafikkarten können zu große Texturkoordinaten zu einem raschem Performanceverlust führen. Das ist dann ein Füllratenproblem von der Karte. Um das vorzubeugen kannst du die Flächen deines Bodens etwas kleiner machen und entsprechend auch die Koordinaten. Bei welchen Karten und ab welcher Koordinatengröße so etwas auftreten kann kann ich nicht genau sagen. Aber ich denke mal bei dir geht der Trend schon ein wenig in die Richtung. Das würde ich aber erst ändern, wenn die Koordinaten noch größer werden und sich solche Probleme erkennen lassen. Sonst solltest du das vernachlässigen können.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Do 14.04.05 14:06
Ich habe jetzt die beiden Dinge umgeändert. Das glGenLists(1) hatte ich vergessen, da ich, als ich es eingefügt hatte, das Projekt nicht gespeichert hatte, da ein Versuch daneben ging und ich keine Lust hatte alles wieder wegzumachen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84:
| procedure WeltGlLoad; var WandTex: TglBitmap2D; BodenTex: TglBitmap2D; DeckeTex: TglBitmap2D; begin glGenLists(1); WandTex:=TglBitmap2D.Create('Wand.jpg'); BodenTex:=TglBitmap2D.Create('Boden.jpg'); DeckeTex:=TglBitmap2D.Create('Decke.jpg'); glMatrixMode(GL_MODELVIEW);
glNewList(Weltgl, GL_COMPILE); BodenTex.Bind; glColor3f(1,1,1); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glBegin(GL_QUADS); glTexCoord2f(80,80); glVertex3f(-40.000, 0.000,- 40.000); glTexCoord2f(80, 0); glVertex3f(-40.000, 0.000, 0.000); glTexCoord2f( 0, 0); glVertex3f( 0.000, 0.000, 0.000); glTexCoord2f( 0,80); glVertex3f( 0.000, 0.000,- 40.000); glEnd; DeckeTex.Bind; glBegin(GL_QUADS); glTexCoord2f( 0,80); glVertex3f( 0.000, Geschosshoehe,- 40.000); glTexCoord2f( 0, 0); glVertex3f( 0.000, Geschosshoehe, 0.000); glTexCoord2f(80, 0); glVertex3f(-40.000, Geschosshoehe, 0.000); glTexCoord2f(80,80); glVertex3f(-40.000, Geschosshoehe,- 40.000); glEnd; WandTex.Bind; glBegin(GL_QUADS); Wand(-40.000,-40.000, 0.000,-40.000); Wand( 0.000, 0.000,-40.000, 0.000); Wand(-40.000, 00.000,-40.000,-40.000); Wand( 0.000,-40.000, 0.000, 0.000); Wand(-15.800,-40.000,-15.800,-20.000); Wand(-15.500,-19.500,-15.500,-40.000); Wand(-15.800,-20.000,-17.800,-20.000); Wand(-17.800,-19.500,-15.500,-19.500); Tuer(-17.800,-20.000,-18.800,-20.000); Tuer(-18.800,-19.500,-17.800,-19.500); WaagerechteQuadrDecke(-18.800,-20.000,-17.800,-19.500, Tuerhoehe); TuerSeiten(-17.800,-20.000,-17.800,-19.500); TuerSeiten(-18.800,-19.500,-18.800,-20.000); Wand(-18.800,-20.000,-40.000,-20.000); Wand(-40.000,-19.500,-18.800,-19.500);
Wand(-12.000,-16.000,-40.000,-16.000); Wand(-40.000,-15.500,-12.000,-15.500); Tuer(-11.000,-16.000,-12.000,-16.000); Tuer(-12.000,-15.500,-11.000,-15.500); WaagerechteQuadrDecke(-12.000,-16.000,-11.000,-15.500,Tuerhoehe); TuerSeiten(-12.000,-15.500,-12.000,-16.000); TuerSeiten(-11.000,-16.000,-11.000,-15.500); Wand(- 9.000,-16.000,-11.000,-16.000); Wand(-11.000,-15.500,- 9.000,-15.500);
Tuer(- 8.000,-16.000,- 9.000,-16.000); Tuer(- 9.000,-15.500,- 8.000,-15.500); WaagerechteQuadrDecke(- 8.000,-15.500,- 9.000,-16.000,Tuerhoehe); TuerSeiten(- 9.000,-15.500,- 9.000,-16.000); TuerSeiten(- 8.000,-16.000,- 8.000,-15.500); Wand( 0.000,-16.000,- 8.000,-16.000); Wand(- 8.000,-15.500, 0.000,-15.500); Wand(-10.100,-15.500,-10.100, 0.000); Wand(- 9.900, 0.000,- 9.900,-15.500);
Wand(-19.500,-16.000,-19.500,-17.250); Wand(-19.700,-17.250,-19.700,-16.000); Tuer(-19.500,-17.250,-19.500,-18.250); Tuer(-19.700,-18.250,-19.700,-17.250); WaagerechteQuadrDecke(-19.500,-17.250,-19.700,-18.250,Tuerhoehe); TuerSeiten(-19.500,-17.250,-19.700,-17.250); TuerSeiten(-19.700,-18.250,-19.500,-18.250); Wand(-19.500,-18.250,-19.500,-19.500); Wand(-19.700,-19.550,-19.700,-18.250);
glEnd; glEndList; WandTex.Free; BodenTex.Free; DeckeTex.Free; end; |
Funktioniert aber trotzdem nicht.
PS: Wegen den wirren Sätzen wunder dich bitte nicht. Ich habe weniger das Problem mit der Rechtschreibung, als mit dem Ausdruck, laut meiner Deutschlehrerin (ich finde meinen Ausdruck dagegen nicht so schlimm  ). Achso du hast gesagt, dass große Flächen die Grafikkarten zum Schwitzen bringen können. Da ist mir eine kleine Frage eingefallen: Laufen die Programme schneller, wenn ich im Quelltext Quadrate schon als Dreiecke definiere, oder ist es egal?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 14.04.05 15:32
Bei den Texturen fehlt jetzt das GenTextures.
Und was ich jetzt erst gesehen habe. Em Ende der Methode zerstörst du die Texturen ja wieder.  Das darfst du nicht. Erst am Ende des Programms. So lange müssen die Texturen existieren!
Nicht die Flächen sind das Problem sondern wie häufig darauf eine Textur gezeichnet wird. Aber ich denke mal, dass moderne Karte da nicht so die Probleme dabei haben sollen.
Also es macht recht wenig Unterschied ob du mit Dreiecken oder Vierecken renderst. Die Grafikkarte zerlegt das Viereck sowieso in 2 Dreiecke. Nur als Viereck musst du lediglich 2 x 4 Koordinaten (Vertex, TextCoord) übergeben. Bei zwei Dreiecken wäre es schon insgesamt 2 x 6 Koordinaten. Bei Displayliste fällt das sowieso nicht auf, weil der Treiber das nach seinen Wünschen optimieren kann. Und das tun die sogar ziemlich gut. Bei der Radeon ist es dann auch so, dass er die Daten in den Speicher der Grafikkarte schreibt.
Es gibt auch die Möglichkeit anstelle von einzelnen Flächen Quad oder TriangleStrips zu verwendest. Bei Outdoorszenen kannst du so zum Beispiel einen ganzen Streifen der Landschaft zeichnen. Und dann hast du pro viereckiger Fläche sogar nur noch 2 x 2 Koordinaten. Außer die Erste die hat 2 x 4. Aber das kannst du nicht verwenden, da deine Level dafür nicht geeignet sind (wenig Flächen) und man nicht alles mit strips machen kann. Es ist eine hochmathematische Kust ein Model in optimierte Strips zu zerlegen. Also besser die Finger von lassen. 
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Do 14.04.05 18:25
 schon wieder GenTextur letztesmal nicht mitgespeichert.
Ich habe jetzt die Texturenvariablen global gemacht und das Freigeben der Variablen im OnClose-Ereignis eingefügt. Des weiteren habe ich natürlich das GenTextur wieder eingefügt (fragt sich für wie lange  ). Trotzdem habe ich immer noch den gleichen Fehler.
Aber warum stört das, dass ich die Texturen danach sofort wieder freigebe? Ich denke mal das die Texturen gleich in den Grafikkarten-RAM, inklusive den Flächen, "reinkompliert" werden, so interpretiere ich zu mindestens das Gl_Compile.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Fr 15.04.05 08:12
Was war jetzt gleich noch mal der Fehler? Das Invalid Value? Das finde ich mittlerweile ein wenig merkwürdig. Ich würde dir an der Stelle mal vorschlagen, dass du systematisch dein Programm zerlegst und mal versucht herrauszufinden welcher Befehl dort den Fehler verursacht. Also zu erst einmal so ziemlich alles auskommentieren und dann langsam Schritt für Schritt es alles wieder einkommentieren so wie es derzeit ist. Dann kannst du ja ziemlich gut einschränken bei welcher Aktion dort ein Fehler existiert. Ich kann jetzt so auch nicht genau sagen was Problem ist. Evtl ist es ja etwas was bei deinem Rechner stillschweigend vorrausgesetzt wird aber nicht vorhanden ist.
Zu den Displaylisten. Nur noch mal zum Verständniss. In der DL werden nur OpenGL Befehle abgelegt. Und dann auch nur die die aufgerufen werden. Wenn du also im Delphi irgendwo ein IF hast und der Befehl nicht aufgerufen wurde, dann wird sich das in der DL NIE ändern. Genau so ist es mit den Parametern. Da werden in der DL direkt die Werte abgelegt. Kleines Beispiel um das zu verdeutlichen.
In einer DL sind folgende Befehle.
Delphi-Quelltext 1: 2: 3: 4: 5:
| glGenTextures(1, @TextureID); glBindTexture(GL_TEXTURE_2D, TextureID); glTexImage2D(...); ... glDeleteTextures(1, @TextureID) |
Wenn du die Displayliste jetzt aufrufst, dann erzeugt OpenGL eine Textur und gibt sie am Ende auch wieder frei. ABER. Er kennt die Variable TextureID nicht. Also benutzt er immer die TexturID die sich zum Erstellen der DL in der Variable befunden hat. Bei der ersten Textur ist das immer 1. Wenn wir jetzt ganz woanders im Programm noch eine Textur erstellen und dann die DL aufrufen, dann erstellt OpenGL zusätzlich noch eine Textur mit der ID 2, bindet dann aber die Textur mit der ID 1, füllt sie mit Daten und löscht sie dann wieder. Er hat uns dann also unsere Textur zerstört und die Textur mit der ID 2 existiert weiterhin.
Bei dem oberen Quellcode war hauptsächlich das Problem, dass du die Texturen außerhalb der DL wieder frei gegeben hattest. Das führt dazu, dass du pro Frame 3 Texturen erstellst und die nur die aller ersten 3 wieder frei gegeben wurden. Alle anderen haben sich immer schön an die Liste angehangen.
Davon mal abgesehen ist es äußerst performancefressend, wenn man die Texturen bei jedem Frame neu erzeugt. Viel einfacher ist es doch, wenn man sie ein mal erstellt und dann nur noch benutzt bis man sie nicht mehr braucht, oder? Es spielt dabei auch keine Rolle ob die sich in der DL befinden. Sie werden dennoch bei jedem Frame neu erzeugt und OpenGL muss die Texturdaten in die Texturen kopieren. Das sind einfach Dinge auf die man generell verzichten sollte. Außer es geht nicht anders.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Fr 15.04.05 19:36
Der hat immer noch irgendein Problem in der WeltGlLoad-Prozedur. Der hat irgendein Problem mit der Liste, denn wenn ich alles in der Liste ausklammere kommt der Fehler noch, aber wenn ich das glNewLis und glEndlist ausklammere nicht mehr.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Sa 16.04.05 16:33
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Sa 16.04.05 16:45
Stimmt. Jetzt wo du es sagst seh ich es auch  . Das ist der Nachteil, wenn Delphi nicht rummeckert, das man eine sinnlose Funktion aufruft.
Jetzt funktionieren auch die Texturen, auch wenn es nicht ganz so ist wie es sein sollte, denn der zeichnet die Texturen nicht ordentlich. Im Anhang siehst du wie es jetzt aussieht.
PS: Loss Ex=Steffen?
Einloggen, um Attachments anzusehen!
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Sa 16.04.05 23:00
| Zitat: | Stimmt. Jetzt wo du es sagst seh ich es auch . Das ist der Nachteil, wenn Delphi nicht rummeckert, das man eine sinnlose Funktion aufruft. |
Du kannst die erweiterte Syntax im Delphi ausstellen. Dann meckert er, wenn der Rückgabewert einer Methode nicht benutzt wird. Bringt aber noch ander Umstände mit sich.
| Zitat: | | Jetzt funktionieren auch die Texturen, auch wenn es nicht ganz so ist wie es sein sollte, denn der zeichnet die Texturen nicht ordentlich. Im Anhang siehst du wie es jetzt aussieht. |
Stell mal bei den TexturenLoadern die TexturWraps auf GL_REPEAT. Oder am besten mit der globalen Methode glBitmapSetDefaultTextureWrap. Und zwar bevor du die Texturen estellst!
Japp. Erwischt.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: So 01.05.05 10:21
So OK, das funkttioniert jetzt auch. Ich habe jetzt das gesamte alte Projekt übernommen in die neue Unit. Die Texturen funktionieren jetzt also auch. Ich fand es sah richtig krass aus, wo ich das GL_Repeat noch nicht drinnen hatte. Ein Nachteil hat der neue Texturenloader allerdings gegenüber dem alten: man sieht jetzt auch die schlechten Stellen in den Texturen sofort.
Kann ich eigentlich eine Liste auch in einer DLL reinlegen? Und kann ich die DLL nach dem erstellen der Liste freigeben?
Das Grafikproblem ist jetzt behoben. Und es läuft wieder auf dem alten Rechner und das sogar schneller als mit dem alten Gerüst. Nagut sagen wir es mal so: ich habe jetzt kein OpenGl-Grafikproblem mehr. Ich habe beim alten Rechner jetzt andere Probleme. So schafft er es nicht das Programm zu Beenden, was beim neuen kein Problem ist, aber er schafft es auch nicht in den Vollbildmodus zu wechseln, obwohl ich Borderstyle=bsNone und WindowState=wsMaximized habe. Es bleibt immer die Windowsleiste übrig. Gibt es vlt. bei OpenGl ein Befehl um in den Vollbildmodus zu kommen, oder muss ich SDL verwenden, wenn meine Variante nicht funktioniert?
Einloggen, um Attachments anzusehen!
|
|
|