![]() |
OpenGL Probleme
Wie ich bereits im Thread "Mini Programmiersprache" geschrieben habe, versuche ich jetzt, die Welt des Roboters (Programm+Souce im Thread "Mini Programmiersprache" zum runterladen) dreidimensional zu machen.
Ein Wunder! Es funktioniert sogar. Aber ich hab noch ein paar Probleme. Das erste ist, dass Quadrate plötzlich total verformt werden. In der einen Perspektive ist es ein Quadrat, in der anderen plötlich eine total verzogene Raute. Ist irgendwie total unrealistisch. Kann ich das nicht irgendwie ändern? Das zweite ist: Wie kann ich Modelle laden? (Am besten aus Ressourcendateien.) Das dritte ist: Wie kann ich Texturen aus Ressourcendateien laden? (Ich will nicht, dass jeder einfach meine Texturen verändern kann.). |
Re: OpenGL Probleme
Hmm ich sags ungerne, aber ich glaube auf
![]() ![]() |
Re: OpenGL Probleme
Liste der Anhänge anzeigen (Anzahl: 1)
Screenshots mach ich immer mit der Druck Taste. Geht doch viel einfacher!
|
Re: OpenGL Probleme
Un was soll da falsch sein ?! :gruebel:
Es ist ganz natürlich dass das Bild manchmal so verzerrt vorkommt, je nach der Position der Kamera, entfernung der Objekten, Blickwinkel usw. Kannst du uns etwas von der GLInit posten? Sonst ![]() |
Re: OpenGL Probleme
Ich kenne delphigl.com schon. Dass manchmal das Bild je nach Perspektive verzerrt ist ist mir auch klar, Zentralperspektive halt, aber diese Verzerrung ist alles andere als proportional (siehe Anhang vorheriger Beitrag.)
Achja, ich bräuchte noch ein paar Befehle für Filter/Antialiasing Einstellungen und Befehle zur Optimierung von Qualität/Geschwindigkeit. Ich initialisiere OpenGL folgendermaßen: Das ganze ist in der FormCreate-Prozedur. p3d ist eine Komponente vom Typ TPanel.
Delphi-Quellcode:
canv := TCanvas.Create;
canv.Handle := p3D.Handle; synh := TSynRoboterTronoSyn.Create(commands); status := 'nix'; commands.Highlighter := synh; commands.Modified := False; form1.Left := screen.Width div 2 - form1.Width div 2; form1.Top := screen.Height div 2 - form1.Height div 2; readcmdsintoarray; firsterrorline := -1; xpos := 0; ypos := 0; dir := 'u'; statusbar1.Panels[0].Text := 'Zeile: 1, Spalte: 1'; statusbar1.Panels[1].Text := 'Kein Fehler gefunden.'; statusbar1.Panels[2].Text := '[Unbenannt]'; //drawrobot(0, 0, 'u'); form1.myDC := GetDC(canv.Handle); SetupPixelFormat; myRC := wglCreateContext(mydc); wglMakeCurrent(myDC, myRC); glEnable(GL_DEPTH_TEST); glenable(GL_Line_Smooth); glenable(GL_texture_2d); gridtex := auxDIBImageLoadA('./textures/grid.bmp'); glGenTextures(1, grid); glBindTexture(GL_TEXTURE_2D, grid); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, gridtex^.sizeX, gridtex^.sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, gridtex^.data); //Das ganze noch 3 mal mit anderen Texturen. glViewport(0, 0, p3d.Width, p3d.Height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(100, 1, 0.01, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); |
Re: OpenGL Probleme
Habe jetzt GL_POLYGON_SMOOTH aktiviert, jetzt geht die Kantenglättung schon besser, aber die Linien im Hintergrund wirken immer noch etwas abgestuft und teilweise dünner als welche, die noch weiter hinten sind (?). Und wie kann man zwischen bilinearen/trilinearen und den anderen Filtern umschalten?
|
Re: OpenGL Probleme
Man sollte gluPerspective so ungefähr aufrufen :
Delphi-Quellcode:
Edit
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, ClientWidth / ClientHeight, 1.0, 1000.0); // muss nicht 45.0 deg sein, aber 100.0 ist auch IMHO zu viel (zu breit) // das Wichtigste ist [b]ClientWidth / ClientHeight[/b] Bei dir ist ClientWidth / ClientHeight = 1, da nehme ich ein, dass ClientWidth = ClientHeight immer gilt ? |
Re: OpenGL Probleme
Mal so ein Frage: Warum machst nicht den Hintergrund Schwarz, und ziehst dann alle Gitterlinien auf jeder Ebene in der Farbe Orange oder so, das sieht IMHO besser aus!
|
Re: OpenGL Probleme
@Speedmaster: Ich kanns mal probieren, aber ich denke nicht, dass es besser aussieht.
@sniper_w: Richtig, die Kompo p3d ist nichts anderes als ein Panel mit Width 521 und Height 521, und damit der arme Computer nicht soviel rechnen muss hab ich einfach 1 geschrieben. 100 hab ich genommen, damit das ganze auch auf das Panel passt. Der Einfachheit halber ist nämlich jedes Quadrat genau 1x1 groß. Ich probiers mal mit anderen Werten. Meine andere Frage nach Filtereinstellungen und Fullscreenantialiasing wurde immer noch nicht beantwortet. Achja übrigens bitte ich euch, den Source Code meines Programms nicht herumzugeben, das Projekt ist zwar Freeware, aber nicht Open Source. |
Re: OpenGL Probleme
Hab jetzt die Perspektive auf 45 gestellt (hätt ich mir auch denken können).
Aber auf dem Bild sind weiterhin lauter Artefakte, Linien werden teilweise nur gestrichelt dargestellt. Schwarz mit Orange ist nicht so ganz das wahre. Noch eine Frage: Wie binde ich ein fertiges 3D Modell ein? Und die Frage über die Einbindung von Texturen aus Ressourcendateien ist auch noch nicht beantwortet. |
Re: OpenGL Probleme
Loaden von Texturen...Ganz einfach. :zwinker:
Wichtig : Die folgende Procedure ist nicht von mir ! (von einem ![]()
Delphi-Quellcode:
procedure LoadTextureFromBitmap(bmp:TBitmap);
var data:PByteArray; i,w:integer; b:PByteArray; begin bmp.PixelFormat:=pf32bit; getmem(data,bmp.width*bmp.height*4); w:=bmp.Width; for i:=0 to bmp.Height-1 do begin b:=bmp.ScanLine[i]; move(b^,data^[i*w*4],w*4); end; gltexparameteri(GL_TEXTURE_2D,GL_Texture_min_filter,GL_LINEAR); gltexparameteri(GL_TEXTURE_2D,GL_Texture_mag_filter,GL_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D,gl_RGBA8,bmp.width,bmp.Height,GL_BGRA,gl_unsigned_byte,data); //glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,bmp.width,bmp.Height,0,GL_BGRA, GL_UNSIGNED_BYTE, Data); FreeMem(data); end; // aufruf ist von mir :mrgreen: procedure TForm1.Button1Click(Sender: TObject); var MyResBitmap : TBitmap; TextID : Cardinal; begin MyResBitmap := TBitmap.Create; MyResBitmap.LoadFromResourceName(HInstance, 'MyBitmap' ); glGenTextures(1,@TextID); glBindTexture(GL_TEXTURE_2D,TextID); LoadTextureFromBitmap(MyResBitmap); MyResBitmap.Free; end; |
Re: OpenGL Probleme
Danke. Damit wärens also nur noch 4 offene Fragen...
|
Re: OpenGL Probleme
Naja, mit Verlaub, Du setzt Dich hier auch wie ein kleines Buddha hin und wartest, dass man Dir Lösungen präsentierst.
Gerade was das mit den 3D-Modellen angeht, ist die Frage schlichtweg zu ungenau gestellt. Was für Formate den eigentlich? Die gibt es wie Sand am mehr. Bei uns auf der Seite findest Du einen alten Loader für MS3D und einen für AC3D, im Forum gibt das Mitglied Noeska, der einen 3DS-Loader bereit stellt. Für die meisten Projekte empfiehlt es sich ein eignes simples Format zu "erstellen" und andere Modellformate dafür zu verwenden. Solltest Du Python mächtig sein und Blender nutzen, bringt das von Haus aus einige Klasse funktionen im die Geometry so zu exportieren wie man es gerne mag. Ich denke auch, dass ich die Texturen nicht über eine Ressourcendatei einbinden würde. Gerade zur Entwicklungszeit würde ich eher davon abraten. Sollte dann bei einem Release wirklich davon abgesehen werden, würde ich auch hier eher zu einer simplen eigen Kreation neigen. Einer Datei mit voranstellender Liste und ein paar Offsets, gefolgt von den eigentlich Nutzendaten. Das hätte z.B. den Vorteil, dass Du in der Liste auch eigene Namen vergeben könntest und eine leichtere Integration in einen Textur-Manager gewährleisten könntest. Ich denke das Phänomen mit den Linien, dass Du beschreibst ist vollkommen normal. Anti-Aliasing könnte dort helfen. Ein entsprechendes Festsetzen geht über eine WGL-Funktion, die ich nicht zur Hand habe. Versuchs einfach mal über deinen Treiber hochzudrehen. Bringt es etwas? Versuche auch einmal mit glLineWidth die Linien dicker zu machen. Bringt dieser Effekt bereits eine Linderung? Ebenfalls nicht bei mir im Kopf... es gibt Verfahren um mit Hilfe von Blending eine Kantenglättung zu erreichen ( ![]() ![]() Ich denke, dass sollte erstmal genug Ansatz bzw. Stoff für weitere Recherchen sein. |
Re: OpenGL Probleme
Ich denke ein Forum ist dazu da, Fragen zu stellen, und schließlich stelle ich nicht nur Fragen, sondern versuche auch anderen zu helfen.
Antialiasing habe ich bereits mit GLENABLE(GL_LINE_SMOOTH) und (GL_POLYGON_SMOOTH) aktiviert. Das mit den Modellen lasse ich dann doch lieber, sieht ziemlich kompliziert aus und schließlich weiß ich erst seit 4 Tagen, was OpenGL ist, außerdem schmiert Blender ständig ab. Über den Treiber hochschrauben, meinst du unter Eigenschaften von Anzeige\Einstellungen\Erweitert...? Bei mir bringts nichts. Für die Vorschläge danke, werds mal ausprobieren. |
Re: OpenGL Probleme
Zitat:
|
Re: OpenGL Probleme
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: OpenGL Probleme
Ich denke nicht, dass man aus einigen Punkten am Satzende einen Vorwurf schließen kann, und so war es auch nicht gemeint.
Linien breiter machen hilft gar nichts. Hab ich schon versucht. Ich habe keine Ahnung, wie ich WGL oder GLU Funktionen/Prozeduren benutze, bzw. welche Units/DLLs ich dazu einbinden muss. In der Wikipedia hab ich dazu auch nichts gefunden. |
Re: OpenGL Probleme
Nicht, Wikipedia ;)
Die WGL-Funktionen sollten in deinen Headern erhältlich sein. Allerdings habe ich gerade einmal Google angeschmissen. Nicht wirklich gelesen, aber überflogen. Es scheint auch inzwischen eine ARB_Lösung zu geben (Ja... man fühlt sich immer schon so alt.) ![]() Das das dicker machen der Linien nichts bringt, fällt mir schwer zu glauben, dass sie den Effekt eigentlich sogar erheblich abschwächen sollten. Poste nochmal bitte ein Screen. Ansonsten musst Du wirklich versuchen mit Hilfe eines Blending verfahrens die Kanten gezielt abzuschwächen. |
Re: OpenGL Probleme
Wie gesagt: Ich habe null Ahnung von OpenGL. Ich weiß, wie man Blending bastelt und hab mir auch deine Tutorials durchgesehen (Respekt!), aber wie man aus Blending einen AntiAliasing Effekt bastelt, kann ich mir nicht denken.
Und was ist ein Header? In der Wikipedia hab ich nachgeschaut, ob da drinsteht, wie man WGL kriegt. Wenn ich die Linien dicker mache, lässt der Effekt zwar nach, aber dann wirken sie hinten immer noch viel dünner als vorne und man sieht das Aliasing noch mehr als zuvor. Der Link ist zwar genau das richtige aber: Wenn du mich fragst in C oder C++, und ich kann nur Object Pascal. Hilft mir also auch nicht wirklich weiter. Ich hab jetzt aber das ganze ziemlich gut hinbekommen, in dem ich eine 32*32 Textur für die Gitterlinien hergenommen hab und das ganze kachele. Ungefähr so:
Delphi-Quellcode:
Sieht wirklich gut aus, auch wenn der Roboter nur ein Quader ist und deshalb ziemlich besch...eiden aussieht.
glbegin(GL_QUADS);
gltexcoord(0,0); glvertex3f(-5,-5); gltexcoord(10,0); glvertex3f(5,-5); gltexcoord(10,10); glvertex3f(5,5); gltexcoord(0,10); glvertex3f(-5,5); glend; |
Re: OpenGL Probleme
Erstmal danke für das Lob ;) Schau in ein paar Monaten nochmal vorbei, zahlreiche der alten Tutorials (und das ist eines) werden grundlegend überarbeitet.
@blendaliasing: Ich weiß es auch nicht genau, da ich es nie gemacht habe. Ich vermute auch, dass das Ergebis nicht mehr ganz zeitgemäß sein wird. Im Wiki sind die Blendfactoren vermerkt, die dafür eigentlich gedacht sind. Die Idee besteht halt darinne die Seiten so farblich abzuschwächen, dass die Treppenbildung abnimmt. Da Du ja aber nicht über Treppen klagst, sondern über die Dicke... und das ist ja auch verständlich, dass sie hinten hin abnimmt. Aber ich denke auch, dass eine Textur dort wohl ein besseres Ergebnis bringen wird, zumal man so leicht noch das ganze ein wenig grafisch aufpeppen könnte. @header: OpenGL wird aus DLLs bezogen. Diese kommen im "IdealfalL" von NVIDIA oder ATI (und besser nicht von MS *g). Die Header sind quasi die Schnittstelle zu der DLL und werden in Form einer Unit geliefert, die die Funktionen mit denen der DLL verbinden. Borland lieferte von Haus aus eine "opengl.pas". Diese sollte man allerdings meiden wie die Pest, da diese nicht nur fehlerhaft ist, sondern Funktionen teilweise sogar anders heißen. Es gibt dann einige Versionen von Mike Lischke sowie den Jedis, die meist auf dem Namen "opengl12.pas" hört. Diese sind eigentlich einwandfrei und man gut damit arbeiten. Wenn Du dann allerdings Features von OpenGL 1.5 benötigst (das aktuellste) empfehle ich Dir die Header zu verwenden, die ein eingefleischtes Team unseres Forums erzeugt hat. Diese hören auf den Namen "dglopengl.pas" und sind im Gespräch als künftige JEDI-Header. Darauf zu setzen wird also sicherlich kein Nachteil sein. In diesen Headern sollten die WGL-Funktionen enthalten sein. (Also OpenGL-Funktionen, die es NUR unter Windows gibt und z.B. das Pixelformat setzen etc. Unter Linux bzw. X-Servern heißen diese GLX_) @c/c++: Ach komm ;) OpenGL unterscheidet sich doch in den meisten Sprachen nicht sonderlich :-) Allerdings solltest Du sobald wie möglich einen kleinen "Crashkurs" in C/C++ belegen, damit Du zumindest die wichtigsten Datentypen und Syntax beherrscht. NVIDIA und Ati veröffentlichen Ihre Beispiele meist nur in diesen Sprachen und es wäre schade, wenn man damit nichts anfangen könnte ;) |
Re: OpenGL Probleme
@C: Ich bin 14! Ich kann mir weder einen C/C++/Visual C++/wasauchimmer Compiler leisten, noch einen Kurs. Ich bin froh, dass ich einigermaßen Delphi beherrsche (Mein Prog ist seit ich eine Variablenfunktion eingefügt habe so buggy, dass ich es nur noch ausführen kann, indem ich jeden Fehler unterdrücke).
Dass die Linien nach hinten dünner werden ist ja klar, aber dass sie teilweise nicht mehr sichtbar oder nur noch gestrichelt sind ist überhaupt nicht klar. |
Re: OpenGL Probleme
Lad doch mal den neuen Quelltext hoch!
|
Re: OpenGL Probleme
Ja, werd ich machen, aber ich warne euch: Das mit den Variablen haut überhaupt nicht hin, ich bekomm ständig AccessViolations.
|
Re: OpenGL Probleme
Gebe dir ein Tipp: Schreib mal alles neu, du wirst merken das alles besser geht, ist leider eine Programmierkrankheit!
Ach: Arbeite mit Klassen und vielen records, kenne dein Quelltext zwar nicht aber ist besonderst bei 3D sehr wichtig! |
Re: OpenGL Probleme
Ich habe nur einen Record definier, und das ist:
Delphi-Quellcode:
Mit Quelltext ist es wie mit Kunst: Hauptsache der Erschaffer verstehts. :wink:
type TRoboVar = record
Name: String; Wert: Integer; end; |
Re: OpenGL Probleme
Zitat:
P.s.: Versuchs doch auch mal im IRC unter #delphi.de |
Re: OpenGL Probleme
Ich habe ein paar globale Variablen:
xpos: X-Position des Roboters. ypos: Y-Position des Roboters. dir: Richtung, entweder 'o','u','r' oder 'l'. x,y,z: Definiert die aktuelle Kameraposition. |
Re: OpenGL Probleme
Zitat:
Delphi-Quellcode:
Von dem Grundsatz kannst du Recht einfach dein Objekt im 3D Raum bewegen!TRobdirection = (RD_Right, RD_Left, RD_down, RD_Up, RD_forward, RD_Backward); TState = record Direction: TRobdirection; // Für Die Richtung x,y,z: Integer; // Gehe von einem großem Raum aus, sonst byte end; Um ehrlich zu sein ich habe ein Persönliches Interesse an deinen Fähigkeiten, du scheinst recht schnell zu lernen! |
Re: OpenGL Probleme
Tja, schnell lernen kann ich. Mein Problem sind momentan die ganzen Access Violations, Texturen, OpenGL und das ganze funktioniert endlich. Ich hab mir ein paar Gedanken über Winkelfunktionen gemacht (Das habe ich erst in der 10.), und jetzt kann man durch den Raum "schweben". Es gibt die globalen Variablen pitch und yaw, die die X-und Y-Neigung angeben und anhand von ihnen kann man mit der Maus die Richtung zu bestimmen und mit den Cursortasten sich zu bewegen. Außerdem kann man den Roboter aus der Egoperspektive wie in einem Autorennen steuern. Sieht ganz gut aus.
Jetzt müssen noch die Variablen funktionieren und ich muss Prozeduren einbauen (mit einem dynamischen array of TStrings). Dann bin ich zufrieden. :mrgreen: |
Re: OpenGL Probleme
Ach noch was zu den Variablen, leg die doch besser so an(Viel mir heute ein):
Delphi-Quellcode:
Das ganze als Array lässt sich besser verarbeiten als 2 Arrays!
TVariable = record
NameofVar: ShortString; ValueofVar: Integer; end; |
Re: OpenGL Probleme
Genauso hab ichs ja, nur die Bezeichnungen sind anders.
Ich habe dann noch folgendes:
Delphi-Quellcode:
Dürfte so ziemlich das gleiche sein.
var vararray: array of TRoboVar;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz