GLScene: Frage bezüglich dem erstellen von Primitives etc.



  • Hallo.

    Ich habe diverse Punkte als Ausgangsbasis und möchte sowohl Punktwolken, also auch diese mit Linien verbinden oder gar ein Object darstellen. Ich habe alles realisiert, aber es ist extrem langsam und bei einer Aufbauzeit von 15-20s nicht in der Form brauchbar. Vielleicht kann mir jemand sagen ob ich hier was falsch mache oder es einfach so langsam ist? Wenn ich das selbe unten beschriebene Prinzip mit GLLines und GLPoints mache, dann ist es nur 1-2s bis alles angezeigt wird.

    procedure TForm1.UpdateSceneMesh();
    var
        nodes: TVectorList;
    
    procedure DrawPolygon(nodes: TVectorList; LineColor : TGLColor);
    var
        i : Integer;
        GLPolygon : TGLPolygon;
    begin
        GLPolygon := TGLPolygon(GLDummyCube1.AddNewChild(TGLPolygon));
        GLPolygon.BeginUpdate;
        GLPolygon.Material.FrontProperties.Emission.Color := LineColor.Color;
    
        for i := 0 to nodes.Count - 1 do
        begin
            GLPolygon.AddNode(nodes.Items[i]);
        end;
    
        GLPolygon.EndUpdate;
    end;
    
    begin
        GLDummyCube1.DeleteChildren;
        GLDummyCube1.BeginUpdate;
    
        nodes := TVectorList.Create;
    {
    Hier lese ich meine Punkte in ein Array ein und leere bei jedem Schleifendurchlauf die TVectorList, welche am Ende der Schleife aus den hinzugefügten Vectoren ein neues Polygon erstellt.
    }
        for i:= 0 to count - 1 do
        begin
             nodes.Clear;
    
             nodes.AddPoint(Vector3f(x,y,z));
             nodes.AddPoint(Vector3f(x..,y..,z..));
             nodes.AddPoint(Vector3f(x..,y..,z..));
             nodes.AddPoint(Vector3f(x..,y..,z..));
    
             DrawPolygon(nodes,clrGreen);
        end;
    end;
    

    Das ist jetzt vereinfacht dargestellt, damit man den Code besser überschauen kann. Fehlt mir hier irgendwo ein BeginUpdate/EndUpdate oder erstelle ich gar das Polygon auf einer gänzlich falschen Art und Weise?

    Es dauert nur das Initialisieren so lang. Wenn ich das Objekt im GLSceneViewer bewege, ist die Animation flüssig. Daher denke ich das ich irgendwas falsch machen muss beim erstellen der Polygone.

    Wenn ich den Inhalt der Prozedure von DrawPolygon auskommentiere, ist alles sofort berechnet. Es liegt also am Createn oder vielleicht irgendwo fehlende BeginUpdate? Oder dauert das einfach so lange? ^^

    Gibt es eventuell die Möglichkeit das Rendern am Schluss zu machen? Aktuell zeichnet er jedes Polygon sofort nach dem erstellen dieses. Eventuell gibt das ja etwas Geschwindigkeit?



  • Hänge leider immer noch an dem Problem fest. 😞

    Es handelt sich hierbei um ca. 8200 TGLPolygon's mit jeweils 3 bis 4 Nodes. Kann man da nichts machen? Dauert das wirklich 15-20s um so etwas zu initialisieren? Bewegen lässt es sich dann in der laufenden Anwendung zwar etwas zäh, aber insgesamt doch recht flüssig. Es hängt also nur am erstmaligen initialisieren.



  • Auch wenn ich
    a) weder weiß was für ein Sprache das sein soll und
    b) nicht weiß, welche Biliothek du da verwendest

    kann ich dir sagen: für gewöhnlich ist es in maximal dumme Idee, alle Dreicke einzeln darzustellen. Was du braucht ist Code, der all Dreiecke glichzeitig rendert.



  • Das ist Delphi(Rad Studio) mit einem OpenGL Wrapper namens GLScene, der das arbeiten an OpenGL erheblich vereinfacht.

    für gewöhnlich ist es in maximal dumme Idee, alle Dreicke einzeln darzustellen. Was du braucht ist Code, der all Dreiecke glichzeitig rendert.

    Genau das ist meine Frage wie man dies hier löst. Ich habe fast alle Beispiele des Wrapper durchgeschaut und nichts passendes gefunden. 😉



  • Delius schrieb:

    Das ist Delphi(Rad Studio) mit einem OpenGL Wrapper namens GLScene, der das arbeiten an OpenGL erheblich vereinfacht.

    für gewöhnlich ist es in maximal dumme Idee, alle Dreicke einzeln darzustellen. Was du braucht ist Code, der all Dreiecke glichzeitig rendert.

    Genau das ist meine Frage wie man dies hier löst. Ich habe fast alle Beispiele des Wrapper durchgeschaut und nichts passendes gefunden. 😉

    Das nennt man batching und was du brauchst ist ein Vertex Buffer Object.
    Schau dir mal OpenGL3 an, das hat alles was du brauchst und ist eine modernere API als OGL1/2.
    http://arcsynthesis.org/gltut/
    http://wiki.delphigl.com/index.php/Hauptseite

    Falls du älterem OpenGL bestehst, tut es auch ein Vertex Array.
    Tutorials dazu in Delphi auf der oben gelinkten Seite.


Anmelden zum Antworten