Wie richte ich DirectX 9, so dass Backface-Culling ausgeschaltet ist, z-Pufferung eingeschaltet ist, und Gouraud-Shading Arbeiten, für Dreiecksnetze ohne Normale Daten?

StackOverflow https://stackoverflow.com/questions/2082065

  •  21-09-2019
  •  | 
  •  

Frage

Ich habe Schwierigkeiten wurden mit den richtigen Parametern für die PresentParameters und DirectX-Gerät zu identifizieren, so dass es sowohl Gouraud-Shading und die Verwendung eines Z-Buffer Vertex-Ebene sein kann. Einige Dreiecksnetze funktionieren, haben anderer Hintergrund Dreiecke vor Dreiecken erscheinen, die näher zur Kamera.

Ein Beispiel hierfür finden Sie hier: http://gallery.me.com /robert.perkins/100045/zBufferGone . Die Eingangsdaten sind eine einfache Liste von Vertices in Facetten. Der Wickel Reihenfolge der Scheitelpunkte in jeder Facette ist nicht deterministisch (kommt aus verschiedenen CAD-Software Exportfunktionen) und es gibt keine Normalen Daten.

Die PresentParameters werden jetzt wie folgt festgelegt. Ich weiß, das C # anstelle von C ++ ist, aber ich denke, es ist aussagekräftig genug, und die Parameter passieren zu C ++ Code. Dadurch ergibt sich das Bild in dem Bild; das Verhalten ist das gleiche auf dem Referenzgerät:

             pParams = new PresentParameters()
                    {
                        BackBufferWidth = this.ClientSize.Width,
                        BackBufferHeight = this.ClientSize.Height,
                        AutoDepthStencilFormat = Format.D16,
                        EnableAutoDepthStencil = true,
                        SwapEffect = SwapEffect.Discard,
                        Windowed = true
                    };
            _engineDX9 = new EngineDX9(this, SlimDX.Direct3D9.DeviceType.Hardware, SlimDX.Direct3D9.CreateFlags.SoftwareVertexProcessing, pParams);

            _engineDX9.DefaultCamera.NearPlane = 0;
            _engineDX9.DefaultCamera.FarPlane = 10;
            _engineDX9.D3DDevice.SetRenderState(RenderState.Ambient, false);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.Always);
            _engineDX9.BackColor = Color.White;
            _engineDX9.FillMode = FillMode.Solid;
            _engineDX9.CullMode = Cull.None;

            _engineDX9.DefaultCamera.AspectRatio = (float)this.Width / this.Height;

All meine anderen Setup-Versuche, auch auf dem Referenzgerät, gibt einen COM-Fehlercode ({ "D3DERR_INVALIDCALL: Unzulässiger Aufruf (-2005530516)"}). Was sind die richtigen Setup-Parameter?

EDIT: Die C ++ Klasse, die Schnittstellen mit DirectX9-Sets Standardwerte wie folgt aus:

PresentParameters::PresentParameters()
{
    BackBufferWidth = 640;
    BackBufferHeight = 480;
    BackBufferFormat = Format::X8R8G8B8;
    BackBufferCount = 1;

    Multisample = MultisampleType::None;
    MultisampleQuality = 0;

    SwapEffect = SlimDX::Direct3D9::SwapEffect::Discard;
    DeviceWindowHandle = IntPtr::Zero;
    Windowed = true;
    EnableAutoDepthStencil = true;
    AutoDepthStencilFormat = Format::D24X8;
    PresentFlags = SlimDX::Direct3D9::PresentFlags::None;

    FullScreenRefreshRateInHertz = 0;
    PresentationInterval = PresentInterval::Immediate;
}
War es hilfreich?

Lösung

Wo es eine ungültige zurückrufen?

Edit: Ich bin in dem neuen EngineDX9 Anruf angenommen? Haben Sie versucht, ein Gerät Fenstergriff in den vorliegenden Parameter einstellen?

Edit 2: Haben Sie auf dem Debug-speien im DirectX-Bedienfeld eingeschaltet, um zu sehen, ob es sagt Ihnen, was der Fehler ist

Edit3: Sie haben versucht, Einstellung backbufferWidth und Höhe auf 0? Was ist backbuffercount Set? Könnte auch wert sein „Format.D24S8“ auf dem Backbuffer versuchen? Seine „möglich“ Ihre Grafikkarte nicht unterstützt 16-Bit (unwahrscheinlich, obwohl). Haben Sie in den Kappen geprüft, ob der Modus, den Sie versuchen, zu erstellen gültig ist? Ich asssume, btw, dass die CLR Sprache, die Sie automatisch die Parameter verwenden setzt man nicht auf 0 gesetzt? Ich persönlich immer lieber explizit in solchen Fällen sein ....

PS Ich vermute hier, weil im eine native C ++ DX9-Codierer kein CLR SlimDX Coder ...

Edit4: Ich bin sicher, dass seine fehlende Fenstergriff ... Ich bin wahrscheinlich falsch, aber das ist das einzige, was ich mit dem Setup wirklich falsch sehen. Ein gefensterten DX9 Gerät benötigt ein Fenster. Btw Breite und Höhe nur auf 0 gesetzt, um das Fenster verwenden Sie das Gerät auch die Größe setzen ...

Edit 5: Ich habe hier den falschen Weg hinunter wirklich war. Es ist nichts falsch mit der Schaffung des Geräts, das Ihr „falsches“ Gerät erzeugt. Verwirren Sie nicht mit den vorliegenden Parameter, die sie sind in Ordnung. Der Hauptgrund Sie Probleme mit Ihrem Z-Buffering haben, ist, dass Sie die Vergleichsfunktion zu immer gesetzt. Dies bedeutet, dass, unabhängig davon, was der Z-Puffer enthält, die Pixel-pas und seine z in die Überschreibungs Z-Puffer schreiben, was es ohnehin schon ist. Ich würde wetten, darin liegt Ihr Z-Pufferung Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top