Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
"ZBuffer" Zacken bei Übergänge / Durchscheinen von Flächen (DirectX9 C++)
Hallo zusammen,
ich habe ein kleines Problem beim Rendern von vier Würfel, die ich mittels einer directionalen Lichtquelle beleuchte.
An den Kanten scheinen die Flächen der dahinter liegenden Würfel durch. Es wird schlimmer desto weiter man weg geht oder wenn man schräg von oben auf die Scene blickt. Ganz übel wird es, wenn man mehr als 4 Würfel rendern will.
Zum besseren Verständnis ein Bild von dem Problem:
hab mal ein wenig mit dem AutoDepthStencilFormat rum probiert, wenn ich D3DFMT_D24X8 wähle, dann sieht es recht annehmbar aus. Kann mir das evtl. jemand genauer erklären?
Was du hier siehst ist z-Fighting. Durchdringen sich die Objekte dort, wo die Artefakte auftreten, hast du dort koplanare Dreiecke?
Wie sieht's mit deiner near und far plane aus? Wo befinden sich die?
EDIT: Deiner Beschreibung nach liegt es vermutlich einfach nur daran, dass die Genauigkeit deines z-Buffers nicht ausreichend ist, was vermutlich daran liegt, dass deine near plane zu nach dran und deine far plane zu weit weg ist...
danke für die schnelle Antwort. Leider weiß ich nicht so recht was "koplanare Dreiecke" Dreiecke sind.
meine Near und far plane reicht von 0.01 bis 1000. 1000 ist wirklich etwas weit. Was für Werte würdest du da empfehlen?
edit:
hab jetzt mal zwischen 1 und 300 versucht, sieht schon besser aus
Es scheinen ja immer gleiche Abstände zwischen diesen Zacken zu bestehen, wenn man mal horizontale Linien da ziehen würde, wo so eine Ungenauigkeit anfängt.
Von daher müsste da tatsächlich der Z-Buffer zu ungenau sein, oder?
Der ZBuffer wird mit dem ZWert nach perspektivischer Division gefüllt, er wird also nach hinten immer ungenauer. Was Du da siehst, ist wirklich nur ein Mangel an Zahlengenauigkeit. Bei den Splitterwelten nehme ich 0.1 bis 1000, aber die Werte für Dein Projekt sind natürlich abhängig davon, was Du da eigentlich darstellen willst. Außerdem: ich ermittle vor Erzeugen des D3DDevices per IDirect3D9::CheckDeviceFormat die höchste verfügbare Genauigkeit. D24X8 kriegst Du auf praktisch allen Karten heutzutage, damit kann man schon arbeiten.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.
Zu beachten ist auch: 0.01 und 1000 ist vergleichbar mit 0.1 und 10.000. Der Buffer arbeitet logarithmisch und nicht linear (verzeiht die mathematische Ungenauigkeit), also ist die Nearplane auch sehr wichtig.
Ah danke. So ganz sicher war ich mir nicht mehr, ich wollte nur angemerkt haben, dass 0.001 statt 0.1 einen viel größeren Unterschied macht, als man zunächst denken würde.