Du bist nicht angemeldet.

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!

Werbeanzeige

1

17.06.2012, 14:06

"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:

(Link)


Und hier mit mehreren Würfel:

(Link)


Den ZBuffer habe ich wie folgt initialisiert:

C-/C++-Quelltext

1
2
3
4
5
D3DPRESENT_PARAMETERS d3dpp;
//....
//....
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;


Vor jedem Renderdurchgang leere ich die Buffer folgendermaßen:

C-/C++-Quelltext

1
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB( 100, 149, 237 ),1.0f,0);


Ich habe auch schon zusätzlich folgende RenderStates versucht:

C-/C++-Quelltext

1
2
3
4
    g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
    g_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
    g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);


Leider alles ohne Erfolg. Sieht einfach schlimm aus.
Was mache ich falsch?

Viele Grüße
Daniel

2

17.06.2012, 14:22

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?

Danke im Voraus!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

17.06.2012, 14:30

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...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (17.06.2012, 14:40)


4

17.06.2012, 14:54

Hallo dot,

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 :)

5

17.06.2012, 15:29

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?

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

17.06.2012, 18:39

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.

7

17.06.2012, 20:56

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.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

17.06.2012, 21:58

Der Buffer arbeitet logarithmisch und nicht linear (verzeiht die mathematische Ungenauigkeit), also ist die Nearplane auch sehr wichtig.

Leider arbeitet er nicht logarithmisch, das wäre mathematisch ideal. Die 1/w Kurve entspricht einer Hyperbel... ;)

9

17.06.2012, 23:03

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.
Lieber dumm fragen, als dumm bleiben!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

17.06.2012, 23:29

Ich nehme oft sogar einen halben Meter :-)

Werbeanzeige