z-Buffer Artefakte



  • Hi,

    ich hab da folgendes Problem:
    ich habe in Direct3D8 eine beliebige Anzahl von gruppierten von Vertices, die indexiert gerendert werden um z.B einen Raum
    darzustellen. Hierbei besteht dann jede Wand eines Raums aus einer sepraten Gruppe von IndexedPrimitives.
    Das ist deshlab so, weil das ganze in einer Art Comic-Stil gerendert werden soll, also alle Objekte solle schwarze Umrandungen haben und eben auch die Ecken in Räumen usw..
    Dazu ermittele ich die alle außenpunkte eines Objekts und ziehe dann ein schwarze Linie um diese. Klappt auch ganz gut. Des weiteren rendere ich die Objekte Backface als Linien um auch Umrandunge von Runden Objekten zu haben.
    Nur: Wenn zwei Kanten in eine Raumecke aufeinander treffen, dann gibt es Problem mit z-Buffer Artefakten (die schwarzen Linien werden nicht vollständig dargestellt). Also dachte ich, ich rendere die Objekte(D3DPT_TRIANGLELIST) mit ZBias 0 und die schwarzen
    Linien(D3DT_LINESTRIP) mit ZBias 16, das brachte aber nur eine geringe Verbesserung. Also dachte ich weiter: zuerst die Linien rendern mit ZFUNC = LESSEQUAL( standard), dann die Objekte mit ZFUNC = LESS -> kein wirklicher Erfolg.

    Wer hat noch ne Idee diese z-Buffer-Artfeakte zu vermeiden? In Stencil-Buffer Techniken bin ich icht ganz so fit, aber wenns nicht anders eght beschäftige ich mich auch damit. Oder wie könnte man die Lines dicker machen? Ich will ehrlich gesagt keine Quader für jede Linie erstellen, weil einige Objekte dynamisch sein sollen und die Performance ja auch ne Rollte spielt.



  • Benutzt du schon den 24bit Buffer oder sind es Rundungsfehler?


  • Mod

    vielleicht könnten wir dir wenn wir einen screenshot sehen besser helfen (falls wir da fehler sehen oder so)

    die einfachste methode um die umrandung um objekte zu bekommen war glaube ich, wenn man das objekt leicht scaled (vergrößter) und nur die backfaces rendert (in schwarz z.B. fogcolor schwarz und volle intensität, oder lighting an und keine lichtquellen)

    damit schaut es gut aus, wenn man es richtig eingestellt hat.

    kann es vielleicht sein dass du vertexshader und TnL kombinierts?

    rapso->greets();



  • Hi,

    Ja der zBuffer ist D3DFMT_D24X8.

    Ich bin grad in der Firma und der Scrennshot kommt deswegen später.

    Angenommen ich würde die Objekte leicht vergrößert, schwarz rendern, dann hätte ich aber noch keine schwarzen Kanten bei z.B. Ausschnitten aus einer Fläche. da ja "Löcher" sozusagen verkleinert werden müssten. Nichtsdestotrotz ein guter Gedanke. Aber ob das auch das Problem mit nach hinten aufeinandertreffenden Kanten lösen würde? Ich glaubs nicht, da die z-Werte ja geringe seien müssten als vorher...

    Probieren werd ichs aber...


  • Mod

    naja, am besten läuft das wohl im vertexshader wo man pro vertex die normale (skaliert) aufaddiert.

    und wie schaut es nun mit vertexshadern aus, nutzt du die nun vielleicht in kombination mit TnL?

    rapso->greets();



  • Nö, keine VertexShader, nur FVF. Ansonsten ist eine HAL-Device mit wahlweise Softwarevertexprocessing. GK ist eine Geforce4 Ti-42000.



  • illuminator schrieb:

    Nö, keine VertexShader, nur FVF. Ansonsten ist eine HAL-Device mit wahlweise Softwarevertexprocessing. GK ist eine Geforce4 Ti-42000.

    GeForce 4 Ti-42000 ?? - WOW!! 😉



  • Kann man die Linien nicht vor den eigentlichen Objekten mit zwrite disabled rendern?



  • leider nicht. aber auch umgekehrt würde das leider nichts bringen, da man dann ja auch die umrandungs-linien der wände, die vom betrachter weg weisen sehen würde. die möglichkeit eine art line-width einzustellen müßte aber doch irgendwie möglich sein.



  • ZBias == 16? Wirklich 16 oder was meinst Du? Das ist aber schon recht viel....

    Normalerweise macht man es in etwa so:

    fBias = -0.00002f;
    g_pDev->SetRenderState( D3DRS_DEPTHBIAS, *((DWORD*)&fBias));
    

    So müsste das dann eigentlich auf funktionieren.

    P.S: Falls Du auf diese '16' über die SDK-Doku gekommen bist, dann ist es Dir genauso gegangen wie mir am Anfang. Die Stelle ist irgendwie net so verständlich...



  • etwas umständlicher gehts auch: doch mit scaling.
    wenn man die weltmatrix um das kamera-zentrum (vFrom) etwas größer skaliert, dann die wände zeichnet, dann die unskalierte (1,1,1) matrix setzt und anschließend die linien zeichnet klappts auch ganz gut!



  • Hi "mac_bu" 😃 ,

    sieht so aus als hättest du dass schon ausprobiert 🙂 😉

    btw.: wie siehts am Freitag/Wochenende zeitlich bei dir aus?



  • Wenn man da 16 angibt, dann interpretiert er den DWORD-Wert 16 auf Bit-Ebene als float, und dabei wird garantiert totaler Mist rauskommen.



  • TomasRiker schrieb:

    Wenn man da 16 angibt, dann interpretiert er den DWORD-Wert 16 auf Bit-Ebene als float, und dabei wird garantiert totaler Mist rauskommen.

    Totaler Mist nicht, sondern irgendeine Zahl. 😉


Anmelden zum Antworten