zbuffer-problem



  • Moin hier 🙂

    Ich habe folgende problemstellung

    Um meinen z-Buffer nicht jeden Frame zurückzusetzen, subtrahiere ich pro Frame von den Bildschirm-z-Koordinaten immer einen konstanten Wert, damit die neuen z-Werte kleiner als die alten sind und die Objekte des nächsten Frames angezeigt werden können, ohne den zbuffer zurückzusetzen (Ich glaub das Verfahren hat irgendeinen namen, weiß jetzt aber nicht welchen)

    void project ()
    {
        for (int i=0; i<points (); i++)
        ...
        //Spoints: projizierte 3D-Koordinaten, die auch die z-Koordinaten für die rasterization enthalten
        GR_Spoints[i].sz=v[i].vz-depth;
    }
    

    depth wird in jedem Frame mit einer Konstanten addiert, welche die maximal zulässige z-Koordinate darstellt.

    depth+=MAXDEPTH;
    

    Nun das Problem: Bei einem Wert von MAXDEPTH von etwa 1000 oder mehr (auch 100.000 usw) spinnt die Darstellung total, die Polygone verdecken sich nicht so wie sie sollten und die genauigkeit lässt stark nach (ganze Polygone werden plötzlich angezeigt, obwohl sie verdeckt sein sollten; im grunde gibts einen richtigen Polygonbrei).
    Addiere ich bei jedem frame aber mit kleinen Werten um die 100, sind die Fehler nicht so grob (kleine darstellungsfehler treten auf, aber das bild stimmt im großen und ganzen).
    Ich benutze für alle Werte float, für depth wie für den z-buffer oder andere sachen.
    Kann es sein dass es am float liegt (halte ich zwar für unwarscheinlich, aber...)
    Ich hab das problem schon in anderen Foren gepostet, aber keiner weiß was 😞
    Bin für jeden tip/jede idee dankbar (und noch mehr für die Lösung 😉 )

    PS: Ich benutze einen eigenen Renderer, also kein directx.

    Übrigens wird das bild korrekt angezeigt wenn ich den zbuffer jedes frame cleare.
    Also, hab ich vielleicht was vergessen/falsch gemacht?



  • Ich denke die Anzahl signifikanter Stellen im float reicht dann nicht mehr aus, so das alle z-Werte auf (ungefähr) -depth gerundet werden. Du könntest natürlich noch einen Faktor für z einfügen, damit das wenigstens einige Frames klappt. Also Bereiche (- 10^3 ; - 10^0) dann (- 10^6; - 10^3) usw. IIRC geht float bis 10^38, also klappt vielleicht so 10-12 Frames.

    Bye, TGGC \-/



  • Ich denke die Anzahl signifikanter Stellen im float reicht dann nicht mehr aus, so das alle z-Werte auf (ungefähr) -depth gerundet werden.

    Sorry das hab ich jetzt nicht verstanden 😉
    Es muss doch eigentlich nix gerundet werden; mein z-buffer besteht auch nur aus floats, genauso wie 'GR_Spoints.sz' (die Bildschirm z-Koordinaten; GR_Spoints enthält auch die Projizierten 3D-Koordinaten).
    Aber ich habe vergessen zu erwähnen dass das (wie du unten beschrieben hast) für einige frames am anfang noch korrekt funktioniert, aber mit fortschreitender Zeit (und höheren Werten für depth bzw. die Bildschirm-z-Koordinaten bzw. den z-buffer) die anzeige grob und ungenau wird.
    Ich setzte depth und den zbuffer nach einer gewissen Zeit natürlich wieder zurück damit kein overflow entsteht.

    Aber warum treten die Probleme bei Werten um die 100 wesentlich weniger auf??

    Edit:
    [qoute]Du könntest natürlich noch einen Faktor für z einfügen, damit das wenigstens einige Frames klappt.[/quote]
    Das reicht mir nicht ich will ihn ja nur sehr selten clearen müssen!



  • Dann musst du wohl nochmal drüber nachdenken. Je größer depth ist, umso mehr muss bei der Subtraktion gerundet werden. Genauigkeit von float ist IIRC nur 6-7 signifikante Ziffern. Genaue mathematische Herleitung kriegst du sicher auch im Matheforum.

    Und 1/12 Arbeit ist doch immer noch deutlich weniger als 1/1. 😎

    Bye, TGGC \-/



  • Jetzt nach dem 4. mal debuggen hab ich verstanden was du meinst (hat 10 min gedauert bis im ~768000 stellen großen zbuffer die Werte gefunden hab...).
    Vielleicht sollte ich einen int-zbuffer benutzen.

    Jedenfalls thx
    (bist der erste aus drei foren ders rausgefunden hat 🙂 hast den Jackpot gewonnen 😃 )



  • Bitte alles überweisen. Und wer weiss was das für Foren waren, warscheinlich Scherfgen's oder gar ZFX. 😎

    Bye, TGGC \-/



  • TGGC schrieb:

    Bitte alles überweisen. Und wer weiss was das für Foren waren, warscheinlich Scherfgen's oder gar ZFX. 😎

    jepp, liegst richtig (zfx). Konnte mir leider niemand helfen dort, community müsste etwas größer sein



  • Ich sag besser nix weiter, hehe. 😎

    Bye, TGGC \-/


Anmelden zum Antworten