Ein paar Tipps



  • Hallo, ich programmiere an einer 3D Bibliothek. Diese basiert auf DirectX.

    Das ganze sieht zur Zeit so aus:

    gxDisable(GX_LIGHT);
        gxDisable(GX_CULLING);
    
        gxClearColor(0.0f, 0.0f, 0.0f);
        gxClearDepth(1.0f);
    
        gxClear(GX_COLOR_BUFFER_BIT|GX_DEPTH_BUFFER_BIT);
    
        gxBegin(GX_TRIANGLELIST);   
            gxColor(1.0f, .0f, .0f);
            gxVertex(-1.0f,-1.0f, .0f);
    
            gxColor( .0f,1.0f, .0f);
            gxVertex(-1.0f, 1.0f, .0f);
    
            gxColor( .0f, .0f,1.0f);
            gxVertex(1.0f,1.0f, .0f);
        gxEnd();
    
        gxBegin(GX_TRIANGLELIST);
            gxColor(1.0f, .0f, .0f);
            gxVertex(-1.0f,-1.0f, 10.0f);
    
            gxColor( .0f,1.0f, .0f);
            gxVertex(-1.0f, 10.0f, .0f);
    
            gxColor( .0f, .0f,1.0f);
            gxVertex(1.0f, 10.0f, .0f);
        gxEnd();
    
        gxFlush();
        gxPageFlip();
    

    ählichkeiten mit OpenGL sind rein zufällig 😃

    Beginnen wir mal hier:

    gxDisable(GX_LIGHT);
        gxDisable(GX_CULLING);
    

    Hier wird die Beleuchtung und das Culling der Rückseiten abgeschaltet. (SetRenderState(....))

    gxClearColor(0.0f, 0.0f, 0.0f);
        gxClearDepth(1.0f);
    
        gxClear(GX_COLOR_BUFFER_BIT|GX_DEPTH_BUFFER_BIT);
    

    Bildschirm und Z-Puffer löschen.

    gxBegin(GX_TRIANGLELIST);   
            gxColor(1.0f, .0f, .0f);
            gxVertex(-1.0f,-1.0f, .0f);
    
            gxColor( .0f,1.0f, .0f);
            gxVertex(-1.0f, 1.0f, .0f);
    
            gxColor( .0f, .0f,1.0f);
            gxVertex(1.0f,1.0f, .0f);
        gxEnd();
    

    Hier passier was wichtiges. Es wir ein Objekt MESH erzeugt. Dieses Objekt speichert alle Vertices, Color und wenn nötig Textur und Normalvectoren. Aktuelle Matrix. Die mit z.B.

    gxTranslate()
    

    eingestellt werden kann.

    Die Funktion gxEnd() beendet die Datenerfassung.

    Erneuter Aufruf der Funktion gxBegin() erzeugt ein neues Objekt MESH.

    gxFlush();
    

    Zeichnet alle Objekte in das Device.

    Ich habe jetzt eine Stelle an der ich nicht weiss wie ich weiter machen soll

    Nehmen wir mal an das ich zwischen diesen Beiden Objekten das Licht ein schalten will.

    [cpp]
    gxBegin(GX_TRIANGLELIST);
    gxColor(1.0f, .0f, .0f);
    gxVertex(-1.0f,-1.0f, .0f);

    gxColor( .0f,1.0f, .0f);
    gxVertex(-1.0f, 1.0f, .0f);

    gxColor( .0f, .0f,1.0f);
    gxVertex(1.0f,1.0f, .0f);
    gxEnd();

    gxEnable(GX_LIGHT);

    gxBegin(GX_TRIANGLELIST);
    gxColor(1.0f, .0f, .0f);
    gxVertex(-1.0f,-1.0f, 10.0f);

    gxColor( .0f,1.0f, .0f);
    gxVertex(-1.0f, 10.0f, .0f);

    gxColor( .0f, .0f,1.0f);
    gxVertex(1.0f, 10.0f, .0f);
    gxEnd();

    [/cpp]

    Das Problem ist das beim Aufruf der Funktion gxFlush() das Device so eingestellt ist das die Beleuchtung an ist. Für das erste Objekt sollte es jedoch abgeschaltet sein. Ich müsste eine Lösung finden das das Device beim rendern immer so eingestellt ist wie ich es haben will.

    Jeder Hinweis, Tipps und VOrschläge sind willkommen.



  • gxBegin sollte die Werte aller Render-States in einer Tabelle abspeichern und diese Einstellungen dann vor dem Rendern aktivieren. Diese Tabelle wäre dann also ein Teil des Mesh-Objekts.



  • Baust du einen DirectX-Wrapper, der wie OpenGL funktioniert? Dann schau mal hier: http://www.v3x.net/directx/ (DirectX Port)
    EDIT: ups, das ist falsch. DirectX Port ist ein OpenGL-Wrapper, der wie DirectX ausssieht, also genau das Umgekehrte.

    [ Dieser Beitrag wurde am 06.04.2003 um 14:18 Uhr von Norondion editiert. ]



  • @Norondion

    Es soll nicht 100% wie OpenGL funktionieren. Ich habe noch nie in OpenGL programmiert. Es ist nur ein Hobbyprojekt an dem ich in meiner Freizeit arbeitet.

    @TomasRiker

    Hört sich gut an. Werde mich gleich mal daran setzten.

    Deshalb meine fragen über BeginScene() und EndScene() 🙂 Ich bin auch kein DirectX Profi 🙄

    [ Dieser Beitrag wurde am 06.04.2003 um 14:21 Uhr von Netzwerk-Latenz editiert. ]



  • @TomasRiker

    Nehmen wir mal an ich habe 20 Objekte mit den selbern Einstelltungen. Ich müsste das Device einmal einstellen und nur die Matrizen ändern. So müsste ich für 20 Objekte jedesmal das Device mit den selben Einstellungen immer wieder einstellen.



  • Speichere Dir in einer zusätzlichen Tabelle den aktuellen Wert jedes Render-States. Bevor Du dann eines setzt, prüfst Du erst, ob es nicht bereits den gewünschten Wert hat.
    Oder verwende Direct3Ds "State Blocks" (siehe Dokumentation).



  • Das mit den Wertevergleichen habe ich mir auch gedacht. Nur ist das Problem bei 3D Anwendungen die Optimierung. Man muss sich immer gedanken machen ob dieser Schritt nötig ist oder ob man ihn einsparen kann.

    Das mit den StateBlocks hört sich schon mal interessant an. Könnte die Lösung meiner Probleme sein.



  • Ich glaube der Schritt ist ja schon ne Optimierung. Wenn man selber prüft dann verhindert man das man was ändert obwohl es doch schon drin ist, was vielleicht rechenintensivier ist.



  • Richtig. Und so ein kleiner Vergleich macht ja so gut wie nichts aus. Da würde man an der falschen Stelle sparen.



  • Also meint ihr das es nicht sehr viel ausmacht wenn ich vorher kontrolliere ob eine RenderState gesetzt wurde. Ja dann mach ich es so. Ich vertraue auf euer wissen 🙂



  • Wenn es einen interessiert.

    Ich speichere die Zustände, bei Aufruf der Funktionen gxEnable und gxDisable, in einer List. Diese List wird beimerzeugen einer neues Objekt mit gxBegin() an das Objekt übergeben. Die "Globale"List wird daraufhin zerstört. Es existiert nur noch eine im Objekt. Wird jetzt erneut eine der beiden Funktionen gxEnable und gxDisable aufgerufen wird die "Globale"Liste erneut erstellt und speichert die Einstelltungen. Auch diese Liste wird beim Aufruf der Funktion gxBegin() an das neue Objekt übergeben.

    Der Gedanke ist folgender. Wir das erste Objekt gezeichnet. Übergibt es seine Einstellungen an die RenderFunktion. Gleichzeitig wird ein Zähler, der die Anzahl der Einstellungen gespeichert hatte gelöscht (auf 0 gesetzt). Wir jetzt ein zweites Objekt erstellt ohne neue Einstellungen wird bei diesem das Device nicht mehr neu eingestellt. Weil der Zähler auf 0 steht. Das prüfen ob eine Einstelltung schon gesetzt wurde wird überflüssig.
    Erst ein erneuter Aufruf von gxEnable bzw. gxDisable erhöht den Zähler. Weil jetzt eine Einstellung am Device nötig wird.
    Eine Einstellung bleibt solange erhalten bis diese verändert wird.

    So jetzt ist es schon 0:50 ich muss Morgen um 5 Uhr aus dem Bett. Das wird schwer werden. 😃

    Danke für die Tipps und Ideen. 😉

    [ Dieser Beitrag wurde am 07.04.2003 um 00:49 Uhr von Netzwerk-Latenz editiert. ]



  • So jetzt ist es schon 0:50 ich muss Morgen um 5 Uhr aus dem Bett. Das wird schwer werden.

    Booooaaaaahhhh... kann nicht jeder 28 Stunden am Stück schlafen...

    RESPEKT! :p


Anmelden zum Antworten