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

Anonymous

unregistriert

1

27.04.2004, 20:52

Merkwürdiges Verhalten bei aktiviertem Z-Buffer

Hallo,

ich habe ein Problem mit meinem Programm, welches ein 3D Objekt anzeigen soll. Das Model besteht aus ca. 250 Faces und sieht aus wie ein flaches Stück eines Rohrs.

Mein Problem ist, dass der Z-Buffer anscheinend nicht richtig funktionieren will. Ich habe folgende 2 Bilder von dem Problem gemacht:


(Link)


Im oberen Teil sieht man das Model - jedoch kann man erkennen, dass viele der Primitiven einfach von hinten nach vorne "durchscheinen", anscheinend weil sie als letztes gezeichnet wurden. Sehr gut kann man dies in der rechten oberen Ecke erkennen.

Im unteren Teil des Bildes sieht man, was mit aktiviertem Z-Buffer passiert - das Model wird nicht korrekt angezeigt, anscheinend "kommen die Pixel nicht richtig durch".

Ich benutze folgende Settings:

Projektion: Near Clipping auf 1.0f (je höher der Wert, desto mehr ist von diesen wilden Punkten zu sehen), Far Clipping ist bei 100.0f

BackBufferFormat = D3DFMT_X8R8G8B8
EnableAutoDepthStencil = true
AutoDepthStencilFormat = D3DFMT_D16 oder auch D3DFMT_D24X8 (beides geht nicht, bei letztem ist gar nichts vom Model zu sehen)

Renderstates:
D3DRS_LIGHTING -> false
D3DRS_FILLMODE -> D3DFILL_SOLID
D3DRS_ZENABLE -> true
D3DRS_ZFUNC -> D3DCMP_LESSEQUAL

Ich hoffe, Ihr könnt mir bei diesem Problem helfen, ich weiß einfach nicht mehr weiter. Ich hoffe, ich habe die nötigen Informationen mitgegeben, falls Ihr noch was wissen wollt, poste ich es sofort.


Vielen Dank für Eure Hilfe!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.04.2004, 21:14

hmm...

schau auch du mal nach ob du beim erzeugen der projektionsmatrix nicht die near und far clipping plane kervehrt rum angegeben hast.
irgend sowas hatten wir unlängst mal.

das backface culling is nach dem bild zu urteilen ja wohl nicht schuld.

wenn das auch nix hilft, dann poste mal den dx initialisierungs code.

Anonymous

unregistriert

3

27.04.2004, 22:47

Zitat


schau auch du mal nach ob du beim erzeugen der projektionsmatrix nicht die near und far clipping plane kervehrt rum angegeben hast.
irgend sowas hatten wir unlängst mal


Ja ich hatte das in den Thread gelesen und hoffte natürlich, dass das auch mein Fehler gewesen ist - leider Fehlanzeige. Ich habe die Near- und Far Clipping Ebene korrekt angegeben, zur Überprüfung habe ich auch beide einmal vertauscht. Das Ergebnis blieb gleich :(

Zitat


das backface culling is nach dem bild zu urteilen ja wohl nicht schuld


Ja ich habe auch genau hingecshaut, und es sieht nicht so aus. Das verwenden der verschiedenen Renderstates für das Culling hatte auch keine Änderung gezeigt, das kann also auch ausgeschlossen werden.

Zitat


wenn das auch nix hilft, dann poste mal den dx initialisierungs code


Gut, hier ist also der Code der Initialisierung:


Die PresentParameter:

Quellcode

1
2
3
4
5
6
7
8
9
10
    sPresentParameters.BackBufferWidth      = sWindow.iWidth;
    sPresentParameters.BackBufferHeight     = sWindow.iHeight;
    sPresentParameters.BackBufferFormat     = D3DFMT_X8R8G8B8;
    sPresentParameters.BackBufferCount      = 1;
    sPresentParameters.MultiSampleType      = D3DMULTISAMPLE_NONE;
    sPresentParameters.SwapEffect           = D3DSWAPEFFECT_DISCARD;
    sPresentParameters.Windowed         = true;
    sPresentParameters.EnableAutoDepthStencil   = true;
    sPresentParameters.AutoDepthStencilFormat   = D3DFMT_D16;
    sPresentParameters.PresentationInterval     = D3DPRESENT_INTERVAL_DEFAULT;



sD3DSettings:

Quellcode

1
2
3
    sD3DSettings.D3DDeviceType  = D3DDEVTYPE_HAL;
    sD3DSettings.dwBehaviorFlags    = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    sD3DSettings.dwVertexFormat = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;



Das Erstellen des Devices:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    HRESULT hResult;

    DWORD dwBahaviorFlags = sD3DSettings->dwBehaviorFlags;

    // Sollte hDeviceWindow 0 sein, so wird das durch createWindow erstellte Fenster benutzt
    if (sPresentParameters->hDeviceWindow == 0)
        sPresentParameters->hDeviceWindow = this->hWindow;

    // Geräteschnittstelle erzeugen
    hResult = pD3DInterface->CreateDevice(  0,
                        sD3DSettings->D3DDeviceType,
                        sPresentParameters->hDeviceWindow,
                        dwBahaviorFlags,
                        sPresentParameters,
                        &pD3DDevice);

    if (FAILED(hResult)) return ERR;

    return OK;


Und das initialisieren der Szene:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    HRESULT hResult;

    hResult = pD3DDevice->SetFVF(sD3DSettings->dwVertexFormat);


    // Renderstates setzen
    pD3DDevice->SetRenderState(D3DRS_LIGHTING, false);
    pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
    pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    pD3DDevice->SetRenderState(D3DRS_ZENABLE, true);
    pD3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);



    // Projektionsmatrix

    float fWidth = (float)sD3DSettings->sPresentParameters.BackBufferWidth;
    float fHeight = (float)sD3DSettings->sPresentParameters.BackBufferHeight;

    setProjection(90.0f, fWidth / fHeight, 1.0f, 100.0f);



Ich hoffe wirklich, dass Du mir helfen kannst. Falls Du noch weitere Infos brauchst und ich etwas ausprobieren soll, sag nur bescheid :)


Danke!

Klaus

Treue Seele

Beiträge: 245

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

4

27.04.2004, 22:52

Ich habe mal ein Problem gehabt, das sah genauso aus...

Da hatte sich das so gelöst:

In der Clear-Methode hatte ich einfach nur TARGET angegeben, und den ZBUFFER vergessen. Das könnte bei deinem unteren Bild auch recht gut hinkommen: Es wird gezeichnet und der Z-Buffer beschrieben. Ab dem zweiten Frame, für den der "Farb"-Puffer ja bei dir eindeutig gelcleart wird, schaffen nur noch kleine Teile (float-Ungenauigkeit?) den Z-Test , und werden gerendert.

Vielleicht hast du das ja einfach vergessen - ich hoffe, das hilft ;)
Mozilla Firefox
The Browser - reloaded

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

27.04.2004, 23:03

also auf den ersten blick kann ich da keinen fehler erkennen.
is es möglich dass es am treiber der graka liegt!?
wohl eher nicht, weil das wär dir sicher schon beim ein oder andren prog aufgefallen.

tipp am rande:

wenn du im windowed mode bist, dann kannst du dir das angeben von BackBufferWidth und height und count sparen, einfach BackBufferFormat = D3DFMT_UNKNOWN, dann sucht sich d3d alles weitere selbst zusammen. funktioniert allerdings nur mit windowed = true!
das presentation interval kannst du zum ausschalten von VSync auf D3DPRESENT_INTERVAL_IMMEDIATE stellen, das bringt ein paar fps mehr, allerdings nimmst du damit grafikfehler in kauf. nur so zur info, war grad mal auf thema auf zfx.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

27.04.2004, 23:06

Zitat von »"Klaus"«

Ich habe mal ein Problem gehabt, das sah genauso aus...

Da hatte sich das so gelöst:

In der Clear-Methode hatte ich einfach nur TARGET angegeben, und den ZBUFFER vergessen. Das könnte bei deinem unteren Bild auch recht gut hinkommen: Es wird gezeichnet und der Z-Buffer beschrieben. Ab dem zweiten Frame, für den der "Farb"-Puffer ja bei dir eindeutig gelcleart wird, schaffen nur noch kleine Teile (float-Ungenauigkeit?) den Z-Test , und werden gerendert.

Vielleicht hast du das ja einfach vergessen - ich hoffe, das hilft ;)


stimmt, das könnte sein
hab ich gar nicht dran gedacht, aber is durchaus möglich.
bei mir hat das dann nämlich auch immer so ähnlich ausgesehen ;)

Klaus

Treue Seele

Beiträge: 245

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

7

27.04.2004, 23:22

ich hab da mal so n modell gerendert, das sich um Y drehte, nur einfach um zu schauen, ob das mit den Modellen funktioniert... und ich hab mich schon gewundert, warum nach einem kurzen Aufblitzen im 1. Frame nur noch dünne, flackernde Streifen der Bewegung sichtbar waren. *g*
Es gibt Fehler, an denen verzweifelt man einfach. Dieser is so einer ;)
Man muss da ja erstmal drauf kommen...
Mozilla Firefox
The Browser - reloaded

Anonymous

unregistriert

8

28.04.2004, 01:54

Ihr seid so gut zu mir! :D

Das war ganz genau das Problem, und nun funktioniert alles wunderbar! Ich hatte tatsächlich vergessen, den ZBuffer zu clearen.

So sieht es nun völlig korrekt aus:


(Link)


Ich habe mich da echt dumm und dämlich gesucht, und einfach keine Lösung gefunden :)

Also, nochmals vielen Dank!

Anonymous

unregistriert

9

28.04.2004, 01:56

Oh, und vor Freude hatte ich doch glatt noch vergessen:

Zitat


wenn du im windowed mode bist, dann kannst du dir das angeben von BackBufferWidth und height und count sparen, einfach BackBufferFormat = D3DFMT_UNKNOWN, dann sucht sich d3d alles weitere selbst zusammen. funktioniert allerdings nur mit windowed = true
das presentation interval kannst du zum ausschalten von VSync auf D3DPRESENT_INTERVAL_IMMEDIATE stellen, das bringt ein paar fps mehr, allerdings nimmst du damit grafikfehler in kauf. nur so zur info, war grad mal auf thema auf zfx


Danke, werd' ich mir merken.

Was ist denn "zfx", wenn ich fragen darf?

Klaus

Treue Seele

Beiträge: 245

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

10

28.04.2004, 16:13

Zitat von »"Luke"«

Was ist denn "zfx", wenn ich fragen darf?


http://zfx.info/
Mozilla Firefox
The Browser - reloaded

Werbeanzeige