Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Easy3DGL - Eine Bibliothek für OpenGL (https://www.delphipraxis.net/160483-easy3dgl-eine-bibliothek-fuer-opengl.html)

Edlmann 15. Mai 2011 18:03

Easy3DGL - Eine Bibliothek für OpenGL
 
Liste der Anhänge anzeigen (Anzahl: 2)
Guten Abend liebe DP,
Ich habe schon vor längerer Zeit eine eigene Bibliothek für OpenGL geschrieben, die darauf ausgelegt ist, den Umgang mit OpenGL so einfach wie möglich zu machen, ohne irgendwelche Komplexen Techniken zu nutzen, um das ganze möglichst simpel zu halten.
Bisher hatte ich allerdings keine vollständige Dokumentation dafür geschrieben, was das Veröffentlichen relativ sinnlos gemacht hätte, doch da ich im Moment mehr als genug Zeit habe, hab ich mich mal hingesetzt und einen einfache Dokumentation für diese Bibliothek fertig gestellt.
Ich weiß dass es auch andere Bibliotheken für OpenGL gibt (GlScene etc.), doch diese Bibliothek ist so simpel gehalten, dass man auch aus ihr lernen kann (der Quelltext liegt bei), und so den Einstieg in OpenGL vereinfacht.

Feature-Liste:
- Kameraführung per Maus ohne eigenen Quelltext
- Simpel zu initialisieren: Nur eine Zeile Code benötigt
- Viele simple geometrische Formen als Klasse gekapselt zur einfachen Bedienung (z.B.: Quader, Kugel, Würfel, Kegelstumpf u.v.m.)
- Kamerasensitivität kann eingestellt werden
- Klassen zum einfachen erstellen eines 3D-Hintergrundes
- Unterstützung vieler verschiedener Materialien (Material-Liste muss noch hinzugefügt werden)
Für einen kompletten Überblick der Features siehe beiliegende Dokumentation / Beispielprogramme

Mit der Bibliothek kommen einige kleinere Beispielprogramme, die die verschiedenen Klassen einführen.

Download:
http://dl.dropbox.com/u/12342503/Easy3DGL.rar
Ohne Beispiele:
http://dl.dropbox.com/u/12342503/Easy3DGL_UnitOnly.rar

Falls jemand von euch Verbesserungsmöglichkeiten im Quelltext sieht (was ziemlich sicher der Fall sein wird ;)), postet sie einfach bitte hier, und ich werde sie in die Bibliothek mit aufnehmen.
Ich hoffe die Bibliothek hilft einigen,
Den Thread werd ich bald erweitern mit einer etwas detaillierteren Darstellung der Easy3DGL, das hier ist mehr so eine kleine Vorschau dessen was möglich ist ;)
Danke schomal fürs Feedback und Grüße,
Edlmann

lbccaleb 16. Mai 2011 13:46

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Hallo, erstrmal Danke für die geleistete Arbeit :thumb:

Kenn mich da nicht so aus mit OGL deswegen wollte ich mir das mal ein wenig genauer anschauen.
Allerdings bekomm ich bei allen Bsp.Anwendungen eine Exception am start der Programme.
Woran kann das liegen?

Habe WinVista

Satty67 16. Mai 2011 14:46

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wollte es auch schnell testen, aber Umlaute im Quelltext mochte meine Delphi-Version garnicht. Ist D2009 Vorraussetzung? siehe unten...

ARB_multisample war bei mir auch nicht dabei, aber das hatte ich noch so gefunden...

****

Ok, Umlaute einfach mal ersetzt und läuft...

Beim Beenden Fehler in in EASY3DGL bei:
Delphi-Quellcode:
finalization
  if AppHandle > 0 then
    FreeGL;
Listenindex überschreitet Maximum.

Aber sieht trotzdem schon ganz gut aus:

Edlmann 16. Mai 2011 16:48

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
@lbccaleb: habe ich spontan keine Idee, warum das so ist...Hast du die compilierten Programme ausgeführt oder selbst compiliert?

@Satty67: Ups, hätt dabeischreiben sollen dass ich das in D2007 geschrieben habe...werd vllt noch eine zweite Version für D7 und drunter fertig machen, oder kannst du einfach die Version mit den ersetzten Umlauten hochladen? Wäre super.
Zur ARB_Multisample: Hab nur vergessen die aus den uses zu entfernen, ist gefixxt ;)
Die AV beim Beenden kann ich nicht nachvollziehen...Bei welchem Programm trat das ganze denn auf?

lbccaleb 16. Mai 2011 18:21

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Habe die compilierten Programme aus dem Archiv ausgeführt!

Satty67 16. Mai 2011 18:27

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von Edlmann (Beitrag 1101169)
kannst du einfach die Version mit den ersetzten Umlauten hochladen?
[...]
Bei welchem Programm trat das ganze denn auf?

hab's in der Firma getestet, da liegen auch die korrigierten Units :oops:

War aber nur Würfel und Türkis, bin einfach jeder Fehlermeldung gefolgt und hab' ein ue draus gemacht.

Der Fehler kam bei der SkyBox-Demo...

rweinzierl 17. Mai 2011 10:53

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Hallo

Habe mir gerade die Doku zum Sonnensystem angeschaut, für mich beeindruckend.

Meine bisherigen Erfahrungen beschränken sich auf etwas GLScene und VRML.

Was ich aber suchen würde wäre eine import und exportfunktionalität für 3D DXF dateien.

(Oder ein anderes Format wrl, x3d, ....) .


Ich würde gerne unsere Produkte im 3D zusammenstellen (Die Einzelkomponenten sind im 3D konstuiert)

==> Gibt es so etwas, ich bin doch nicht der erste mit diesem Problem.

==> Ich habe zwar gegoogled aber irgendwie komme ich nicht weiter.

mfg

Reinhold

Edlmann 17. Mai 2011 13:24

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
@satty67: Okey schade, aber das krieg ich glaub ich grad noch selber hin, die paar Ü's umzuwandeln :P
Zu dem Fehler: Ich liebe es etwas zu programmieren, was dann bei anderen Fehler aufwirft die man nicht nachvollziehen kann...Ich habe ehrlich gesagt absolut keine Idee, wo da der Fehler liegen könnte...es gibt eigentlich nur 2 Listen, bei denen der Fehler auftreten könnte, und bei beiden tritt der Fehler bei mir nicht auf...Ich kann das ganze ja leider nicht auf der selben Maschine wie du testen, aber es wäre super wenn du den Fehler mal auf einen kleineren Bereich eingrenzen könntest (z.B. indem du um Teile der Prozedur FreeGL einen try except Block setzt), damit ich den Fehler beheben kann.

@rweinzierl: Mit dem Import von irgendwelchen Datei-Formaten hab ich mich absolut noch nicht beschäftigt, für alle Projekte die ich bisher in OGL geschrieben habe brauchte ich eigentlich nur Texturen...

Satty67 17. Mai 2011 13:34

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von Edlmann (Beitrag 1101356)
auf einen kleineren Bereich eingrenzen

Beim 2. Assigned(SolidList[x]), ohne die Logik zu prüfen riecht das nach Copy&Paste Fehler:
Delphi-Quellcode:
unit Easy3DGL;
[...]
procedure FreeGL;
[...]
  for x := 0 to SolidList.Count - 1 do
  begin
    if Assigned(SolidList[x]) then
    begin
    CItem := SolidList[x];
    CItem.Free;
    end;
  end;

  for y := 0 to TransparentList.Count - 1 do
  begin    
    if Assigned(SolidList[x]) then // <<< Hier
    begin
    CItem := TransparentList[x];
    CItem.Free;
    end;
  end;

DeddyH 17. Mai 2011 13:36

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Deshalb lagert man so etwas auch in eigene Routinen aus ;)

Edlmann 17. Mai 2011 15:06

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Okey, das könnte der Fehler sein...Ja, ist wohl beim einbauen einer extra Liste für die Transparenten Objekte ein wenig zu viel über CopyPaste gelaufen...danke, werd ich sofort korrigieren ;)

lbccaleb 17. Mai 2011 20:14

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Wenn ich ein wenig Zeit die Tage hab, schaue ich mir das nochmal genauer an, kahm da im mom leider noch nicht zu. Werde es dann auch mal selber compilieren, und dann mal sehen wo er sich festhängt...

Edlmann 21. Mai 2011 13:41

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von lbccaleb (Beitrag 1101442)
Wenn ich ein wenig Zeit die Tage hab, schaue ich mir das nochmal genauer an, kahm da im mom leider noch nicht zu. Werde es dann auch mal selber compilieren, und dann mal sehen wo er sich festhängt...

Wäre super ;) Echt schade dass das irgendwie bei allen anderen nicht vernünftig läuft...Ich habs in unserer Schule, auf meinem Laptop, auf meinem Hauptrechner und unter diversen VM's getestet, da lief es einwandfrei...

rollstuhlfahrer 23. Mai 2011 18:05

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
So, ich bin auch dabei, die Bibliothek mal anzutesten. Gleich mal 2 Sachen, die mir aufgefallen sind:

a) (optional) Dateinamen kann man als TFileName deklarieren, so erkennt man besser, dass da ein Dateiname reingehört und sonst nix anderes. TFileName ist auch nur ein Verweis auf String (mit anderem Namen), sodass nur die Aufrufe geändert werden müssten.

b) Die erste Init-Prozedur ist meiner Meinung nach zu restriktiv. Du könntest anstelle von TForm auch TWinControl übergeben. Dieses hat auch alle benötigten Member und dann könnte man auch ein Panel automatisch als Zeichenfläche initialisieren.

c) Eventuell noch eine Unterstützung von PNG als Texturen. Für TGA wäre es nett, einen Link auf ein Programm zu haben, welches das automatisch umwandelt (neben GIMP versteht sich).

d) Und wo ich grad dabei bin: Eine Version ohne Beispiele um die alte Version einfach zu updaten.

e) In der Prozedur "procedure GLSurface.AddHeightMap(MapFile: string);" ist ein größerer Fehler drin. Das TBitmap HMap wird erst NACH dem anfänglichen try erzeugt, nicht davor.

f) Ist das eigentlich ein Problem der D7-Version oder erden Kegelstumpf und Zylinder tatsächlich nicht gezeichnet? - Dann solltest du dir eine inheitliche Methode ausdenken, wie du am besten die Objekte zeichnen könntest: Dein Grundobjekt (müsste GLObject sein) bekommt einfach eine Prozedur namens Draw mit dem Attribut virtual. Sieht dann so aus:
Delphi-Quellcode:
procedure Draw; virtual;
. Diese überschreibst du in allen abgeleiteten Klassen. dann musst du auch nicht in RenderWorld jedes deiner Objekte mit einem IS-Operator abfragen.

g) Bei mir kommt noch eine AV beim schließen des Programms in der Prozedur FreeGL an dieser Stelle:
Delphi-Quellcode:
      if Assigned(TransparentList[y]) then
      begin
        CItem := TransparentList[y];
        CItem.Free;
      end;
Da ich deren Ursache nicht gefunden habe (und du wohl auch nicht, weil sonst kein Try-Except drum herum wäre), wäre es nett, wenn du die Ursache trotzdem finden würdest.

h) Wenn kein OpenGL-fähiger Graphiktreiber installiert ist, was bei mir in der VM der Fall ist, dann quittieren alle Beispielprogramme mit einem großen Haufen von AVs den Dienst. Momentaner Workaround:
Delphi-Quellcode:
  try
    InitForm(Self);
  except
    Error('No OpenGL compatible Graphics Device/Driver found');
    Halt;
  end;
Ich versuche mal was besseres zu finden.

Bernhard

Edlmann 24. Mai 2011 15:47

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
@rollstuhlfahrer: Erstmal ganz großes Dankeschön dass du die die Unit so ausführlich angeschaut hast und nach Fehlern gesucht hast ;) Ich werd die Liste mal durchgehen und schauen, ob und wie ich die einzelnen Punkte fixxen kann.

rollstuhlfahrer 24. Mai 2011 15:52

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Und eine Doku, wie man was dreht und was sich in Abhängigkeit mit dreht.

Kleines Beispiel: Ich habe ein Spielfeld, welches dem User präsentiert wird. Darauf befindet sich momentan 1 Spielstein, den man mit den Pfeiltasten bewegen kann. Ist das Spielfeld nicht gedreht geht alles. Sobald das Spielfeld gedreht wird, fängt das System an zu spinnen, heißt der Spielstein bewegt sich nicht mit einem Winkel von 0° zum Spielfeld.

Noch ein Punkt zur Liste:

Dein TGA-Loader und mein TGA-Bild aus GIMP wollen nicht zusammen kommen. Eventuell solltest du ne Exception mit schönen Fehlertext werfen, wenn ein Fehler im Bilder-Loader auftritt.

PS: Und in
Delphi-Quellcode:
function TGLBMP.LoadImage(filename : String): Boolean;
kann man auch etwas kürzen:
Delphi-Quellcode:
const
  ImageBMP = 0;
  ImageJPG = 1;
  ImageTGA = 2;

  case (AnsiIndexText(ExtractFileExt(filename), ['.bmp', '.jpg', '.png']) of
    ImageBMP: Result := LoadBMP(filename);
    ImageJPG: Result := LoadJPG(filename);
    ImageTGA: Result := LoadTGA(filename);
  end;

PPS:
a) Deine Bibliothek lädt übrgens die Texturen spiegelverkehrt auf die Körper. Workaround (dirty)
Delphi-Quellcode:
.Rotate(180, 0, 0)
.

b) Dein Code:
Delphi-Quellcode:
  AppEvents := TApplicationEvents.Create(AForm);
  AppEvents.OnIdle := Kamera.Render;
Mein Code:
Delphi-Quellcode:
Application.OnIdle := Kamera.Render;
(Die Unit Forms ist ja eh in der USES drin.)

Bernhard

mleyen 26. Mai 2011 12:42

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Bei mir fliegt die Exception bei:
Delphi-Quellcode:
wglSwapIntervalEXT(1);
Und FreeGL sollte auch nicht öfters aufgerufen werden.:shock:

R2009 26. Mai 2011 13:31

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Hi alle,
egal welches Beispielprogramm ich starte --> Resultat: Access violation.

Grüsse Rainer

Edlmann 26. Mai 2011 16:09

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Beim Aktivieren von V-Sync also...werd ich mich mal schlau machen, ob das auf älteren Grakas zu Fehlern führt und wie man diese umgehen kann

@mleyen: Wieso wird FreeGL denn öfters aufgerufen? Das wir eigentlich nur bei der Finalisation aufgerufen, sonst nicht...o_o

mleyen 26. Mai 2011 18:59

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Ich hab das beim Sonnensystem gesehn.
Da wurds in FormDestroy() und in irgendeinem finalization-Abschnitt aufgerufen.

rollstuhlfahrer 26. Mai 2011 19:25

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von mleyen (Beitrag 1103042)
Bei mir fliegt die Exception bei:
Delphi-Quellcode:
wglSwapIntervalEXT(1);
Und FreeGL sollte auch nicht öfters aufgerufen werden.:shock:

Bei mir auch.

Bernhard

ADD: Gibt es eigentlich eine Version, die aktueller ist, als die momentan verfügbare zum Download?

Edlmann 27. Mai 2011 09:40

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Ich hab grade eine neue Version hochgeladen, wo ich beim Starten eines Programms die Fehlerbehandlung verbessert habe und eine andere Prozedur zum V-Sync aktivieren benutze, ich weiß aber nicht ob das den Fehler fixxt...

Zu deiner Liste rollstuhlfahrer:

a) noch nicht erledigt, mach ich aber noch
b) geht leider nicht, da bei TWinControl die Events OnMouseDown etc protected sind
c) den Texturloader habe ich nicht selbst geschrieben, werd mich mal umschauen ob es einen Loader dafür gibt
d) Hinzugefügt
e) gefixxt
f) War in beiden Versionen ein Fehler und ist gefixxt. Das mit der virtuellen Methode hatte ich auch versucht, allerdings wurde die Prozedur dann trotz override nicht korrekt aufgerufen...
g) Den Fehler finde ich einfach nicht. Die AV kommt erst bei CItem.Free, und ich frage ja vorher extra ab ob da auch was ist was man befreien kann...ich versteh es bisher absolut nicht.
h) Ist verbessert, kommt jetzt eine Fehlermeldung

Zweiter Post:

Es kann sein dass der das TGA nicht annimmt, weil es keine Farbtiefe von 32-bit hat. Der Texturloader den ich im Moment benutze unterstützt anscheinend aber nur 32-bittige-tga's
a) liegt auch am Loader, schau ich mir mal an
b) Hab ich verändert.

@mleyen: Habs dann auch relativ schnell nach dem ich den Post oben geschrieben habe gesehen ^^ lag dran dass das Beispiel noch mit einer älteren Version geschrieben wurde, wo das nicht automatisch erledigt wurde. Ist gefixxt.

Vielen Dank fürs Feedback ;)

Satty67 27. Mai 2011 09:57

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von Edlmann (Beitrag 1103238)
g) Den Fehler finde ich einfach nicht.

Kann sein dass ich mich falsch erinnere...

Aber schau Dir mal die Schleife an... meine da war Schleifenvariable x und Zugriff über y (oder umgekehrt)

Edlmann 27. Mai 2011 10:08

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von Satty67 (Beitrag 1103247)
Zitat:

Zitat von Edlmann (Beitrag 1103238)
g) Den Fehler finde ich einfach nicht.

Kann sein dass ich mich falsch erinnere...

Aber schau Dir mal die Schleife an... meine da war Schleifenvariable x und Zugriff über y (oder umgekehrt)

Ne, Variable ist beidesmal x...

Satty67 27. Mai 2011 11:15

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Sehe ich anders...
Delphi-Quellcode:
// FreeGL
  for y := 0 to TransparentList.Count - 1 do
  begin    
    if Assigned(SolidList[x]) then
    begin
    CItem := TransparentList[x];
    CItem.Free;
    end;
  end;
Das auf SolidList geprüft wird statt TransparentList[], war zudem wohl der C&P Fehler

Edlmann 27. Mai 2011 11:17

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Mmh...bei mir steht da:

Delphi-Quellcode:
  try
  for x := SolidList.Count - 1 downto 0 do
  begin
    if Assigned(SolidList[x]) then
    begin
    CItem := SolidList[x];
    SolidList.Remove(CItem);
    CItem.Destroy;
    end;
  end;
  for x := TransparentList.Count - 1 downto 0 do
  begin
    if Assigned(TransparentList[x]) then
    begin
    CItem := TransparentList[x];
    TransparentList.Remove(CItem);
    CItem.Destroy;
    end;
  end;
  except

  end;
kann sein dass ich das schon gefixxt habe, und nur noch nicht hochgeladen, schau ich gleich mal

Satty67 27. Mai 2011 11:19

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Also ist bei mir natürlich noch die ungefixte Version, aber dachte darauf bezog sich die Liste von rollstuhlfahrer. Wenn es gefixt ist, ist ja gut.

Edlmann 27. Mai 2011 11:24

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Sagen wir die CopyPaste Fehler sind gefixxt... die AV kommt noch immer... ^^

mleyen 27. Mai 2011 11:30

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Hab mir die neue Version noch nicht angeschaut, aber statt .Destroy sollte man lieber FreeAndNil() verwenden.
Und ein private-Sichtbarkeitsabschnitt wäre für Sachen wie FreeGL von Vorteil.

rollstuhlfahrer 27. Mai 2011 12:30

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab die AV gefunden: In der TransparentList ist an Position 1 (bei mir) ein schon aus dem Speicher genommenes Objekt, welches fälschlicherweise von Assigned als existent erachtet wird. Jetzt nur noch schauen, wo das Objekt gelöscht wird.

Bernhard

ADD: AV entgültig gefunden: Bei mir wurde ein GLLicht erstellt. Dieses wurde zu der genannten Liste hinzugefügt. Leider wurde dieses Licht vorher bei den Lichtern aus dem Speicher genommen und ist somit nicht mehr da. Dann soll es allerdings wieder aus dem Speicher genommen werden und dann knallt der nächste Zugriff (das war bei mir die Abfrage nach dem Klassenname).

ADD2: Was mir noch auffällt: Meine Objekte sind alle DOPPELT in der Liste, sie werden also auch 2x gezeichnet. Was machen die da doppelt drin?
ADD3: Warum die alle doppelt drin sind? - Das liegt an den Konstuktoren: In GLQuader (Beispiel) wird das Material gesetzt. Dann wird über inherited der Konstruktor von GLObject aufgerufen und dort gleich nochmal das Material gesetzt. -> macht 2 Listeneinträge, von denen einer zu viel ist.

ADD4: Ich habe mal eine geänderte Version hochgeladen (für Delphi ohne Umlaute). Alles, was ich geändert habe, habe ich mit "Änderung" versehen. Teilweise stehen auch die Gründe direkt dabei.

Edlmann 27. Mai 2011 13:21

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
@rollstuhlfahrer: Vielen Dank für die Änderungen, die meisten davon sind sinnvoll und teilweise bügeln sie auch Fehler aus, die sich eingeschlichen haben als ich größere Sachen an der Unit verändert habe (z.B. bei GLSurface die noch deklarierte BitMap etc.).
Jetzt weiß ich auch warum das bei mir mit der virtuellen Methode nicht funktioniert hat, weil ich das abstract vergessen hatte...
Nur bei einer Änderung bin ich der Meinung das sie überflüssig ist, nämlich bei der Prozedur FreeGL, dort hast du folgendes hinzugefügt:

Delphi-Quellcode:
procedure FreeGL;

if AppHandle = 0 then // Änderung!
    Exit;
Allerdings wird die Prozedur gar nicht aufgerufen, wenn AppHandle = 0 ist, aufgrund folgenden Codes:

Delphi-Quellcode:
finalization
  if AppHandle > 0 then
    FreeGL;

rollstuhlfahrer 27. Mai 2011 13:33

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Das ist eine Sicherung gegen mehrfaches aufrufen, woher die Aufrufe auch immer kommen mögen. Ich finde sie sinnvoll, weil dadurch Fehler eliminietr werden, bevor sie auftreten. Alternativ könnte man auch eine Exception werfen, um dem Programierer zu sagen, dass diese Prozedur doch bitte nur 1x aufgerufen werden sollte.

Bernhard

Edlmann 27. Mai 2011 13:36

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Die Prozedur muss ja in der aktuellen Version gar nicht mehr vom Programmierer aufgerufen werden, das übernimmt ja die Unit selber...aber ich lass es einfach mal drin, schadet ja auf der anderen Seite auch niemandem.

Coffeecoder 23. Jan 2012 20:24

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Vielleicht kann ich auch meine Frage in einem separaten Thread aufmachen, aber es passt zu diesem Thema. Ich weiss auch, dass der letzte Beitrag ein Weilchen her ist. Ich bin mit der Klasse Easy3DGL beschäftigt. Auf dem Beispielprogramm von dem Sonnensystem aufbauend, erweitere ich Planeten um Planeten. Den Asteriodengürtel habe ich soweit auch eingebaut. Allerdings dabei, ist die Texture vom Jupiter nicht mehr sichtbar. Der Pfad zur Datei ist korrekt (auch wenn er momentan relativ ist, dies ändere ich später). Ich hänge euch mal einen Screenshot rein. Die roten Planeten sind Jupiter und Neptun, die im Speicher sind, aber nicht gezeichnet werden.

Hier ist mein Code von der FormCreate:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin
        Width := Screen.Width;
        Height := Screen.Height;
        Top := 0;
        Left := 0;
        InitForm(self);

        Sonne := GLKugel.Create(0,0,0,2,'textures/sun_darker.jpg');

        Merkur := GLKugel.Create(2.5,0,0,0.1, 'textures/merkur.jpg');
        Venus := GLKugel.Create(4,0,0,0.4, 'textures/venus.jpg');

        Erde := GLKugel.Create(7,0,0,0.5, 'textures/earth.jpg');
        Erde.SelfRotate(-70,0,0);
        Mond := GLKugel.Create(8.5,0,0,0.2, 'textures/moon.jpg');
        Mars := GLKugel.Create(10,0,0,0.4,'textures/mars.jpg');


        for i:= 1 to ASTERIODENANZAHL do
        begin
               Asteroidenguertel[i] := GLKugel.Create(15,0,0,0.1,'textures/asteriod.jpg');
               Asteroidenguertel[i].Rotate(0,i,0);
        end;


        Jupiter := GLKugel.Create(20,0,0,1,'textures/jupiter.jpg');
        Jupiter.SelfRotate(-90,0,0);

        Saturn := GLKugel.Create(25,0,0,0.8, 'textures/saturn.jpg');
        Saturnring := GLZylinder.Create(25,0,0,0,2,'');
        Saturnring.SelfRotate(-85,0,0);
        Uranus := GLKugel.Create(28,0,0,0.6, 'textures/uranus.jpg');
        Neptun := GLKugel.Create(32,0,0,0.6, 'textures/neptune.jpg');

        SonnenLicht := GlLicht.Create(0,0,0);
        Sonne.SetSelfGlow(1,1,1);
end;
Hat jemand eine Idee voran dies liegen kann, warum die Texture nicht (immer) geladen wird?

Edlmann 7. Feb 2012 13:36

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Nein, fällt mir Spontan leider nichts zu ein...außer dass es ein Fehler in der Textur sein könnte...

Wird der Planet den korrekt gerendert wenn du andere Dinge entfernst? Und wenn ja, welche?

Coffeecoder 7. Feb 2012 20:21

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von Edlmann (Beitrag 1149652)
Nein, fällt mir Spontan leider nichts zu ein...außer dass es ein Fehler in der Textur sein könnte...

Es liegt wohl an der Textur der Bilder. Ich habe ein anderes Bild genommen und als bmp gespeichert, damit werden die Planeten korrekt dargestellt. Wenn ich richtig(?) liege, passiert der "Fehler" in der Funktion
Delphi-Quellcode:
function TGLBMP.LoadJPG(filename : String) : Boolean;
in der Unit glBMP.pas.

Trotzdem danke ;)

EWeiss 7. Feb 2012 20:24

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von Coffeecoder (Beitrag 1149722)
Zitat:

Zitat von Edlmann (Beitrag 1149652)
Nein, fällt mir Spontan leider nichts zu ein...außer dass es ein Fehler in der Textur sein könnte...

Es liegt wohl an der Textur der Bilder. Ich habe ein anderes Bild genommen und als bmp gespeichert, damit werden die Planeten korrekt dargestellt. Wenn ich richtig(?) liege, passiert der "Fehler" in der Funktion
Delphi-Quellcode:
function TGLBMP.LoadJPG(filename : String) : Boolean;
in der Unit glBMP.pas.

Trotzdem danke ;)

Du solltest schon darauf achten das *.jpg auch 24Bit ist.
Teste das mal.

PS:
Obwohl so wie ich gerade sehe nur 32Bit unterstützt werden (JPG)
ColorDepth := 32;

gruss

Coffeecoder 7. Feb 2012 20:42

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von EWeiss (Beitrag 1149723)
Du solltest schon darauf achten das *.jpg auch 24Bit ist.
Teste das mal.

PS:
Obwohl so wie ich gerade sehe nur 32Bit unterstützt werden (JPG)
ColorDepth := 32;

gruss

Gibt es eine Möglichkeit um die Farbtiefe eines Bildes zu ermitteln?

EWeiss 7. Feb 2012 20:54

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von Coffeecoder (Beitrag 1149726)
Gibt es eine Möglichkeit um die Farbtiefe eines Bildes zu ermitteln?

Mit Photoshop und diversen anderen Paint Programmen.
PS:
Oder Eigenschaft vom Bild (TAB Details)

gruss

Coffeecoder 8. Feb 2012 07:30

AW: Easy3DGL - Eine Bibliothek für OpenGL
 
Zitat:

Zitat von EWeiss (Beitrag 1149730)
Zitat:

Zitat von Coffeecoder (Beitrag 1149726)
Gibt es eine Möglichkeit um die Farbtiefe eines Bildes zu ermitteln?

Mit Photoshop und diversen anderen Paint Programmen.
PS:
Oder Eigenschaft vom Bild (TAB Details)

gruss

Danke, ich überprüfe dies und poste heute abend. (Bild nicht dabei ;) )

[Add]: Die Bittiefe des Bilder vom Jupiter ist 24bit sowie wie die anderen Planetenbilder auch. Die anderen werden dennoch dargestellt. Folgender Test habe ich auch gemacht: jupiter.jpg > jupiter.bmp mit 24bit > wird angezeigt. Hat jemand eine Erklärung dafür?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 Uhr.
Seite 1 von 2  1 2      

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