Z-Pufferproblem durch Mischen von 2D-Sprites mit 3D-Modell

8

Ich muss ein 2D-Menü erstellen, über ein 3D-Modell, mit XNA. Im Moment habe ich Spritebatch für 2D und ein 3D-Modell erstellt. Aber, wie ich bemerkt habe und an anderen Stellen erwähnt wurde, wird das Modell wegen des z-Pufferproblems nicht richtig angezeigt. Laut Tutorial soll ich den DepthBuffer in der Draw-Methode wieder aktivieren. Aber irgendwie, wenn ich benutze:

%Vor%

code gibt beim Debuggen einen Fehler aus und sagt:

  

Schreibgeschützter DepthStencilState kann nicht geändert werden. Statusobjekte werden schreibgeschützt, wenn sie zum ersten Mal an ein GraphicsDevice gebunden werden. Um Eigenschaftswerte zu ändern, erstellen Sie eine neue DepthStencilState-Instanz.

Nun habe ich versucht, eine neue Instanz von DepthStencilState zu erstellen, aber selbst das scheint nicht zu funktionieren. Ich bekomme immer den gleichen Fehler, obwohl das Hilfedokument einen Read / Write-Wert vorschlägt.

Bitte helfen Sie mir herauszufinden, wie das 3D-Modell richtig angezeigt wird.

Hier ist der Zeichencode als Referenz.

%Vor%     
jitendragarg 14.02.2011, 20:38
quelle

4 Antworten

8

Sie können ein DepthStencilState-Objekt nicht mehr ändern, nachdem es auf dem Gerät festgelegt wurde. Sie sollten ein einzelnes DepthStencilState-Objekt für jede eindeutige Tiefe / Schabloneneinstellung erstellen, die Sie verwenden möchten. Optimal sollten diese Zustände nur einmal in Ihrem Programm erstellt und dann bei Bedarf auf das Gerät gesetzt werden.

Weitere Informationen finden Sie unter State Objekte in XNA Game Studio 4.0 von Shawn Hargreaves.

Zusätzliche Details:

Sie setzen DepthBufferEnable auf true, aber nicht auch DepthBufferWriteEnable auf true. Anstatt zu versuchen, diese Eigenschaften einzeln festzulegen, sollten Sie besser die vorab erstellten DepthStencilState-Objekte verwenden, die vom Framework bereitgestellt werden. Bevor Sie das Modell rendern, setzen Sie GraphicsDevice.DepthStencilState auf DepthStencilState.Default. Dadurch werden die DepthBufferEnable- und DepthBufferWriteEnable-Eigenschaften auf true festgelegt.

Sie müssen den BlendState auf dem Gerät auch auf BlendState.Opaque einstellen.

Sie müssen diese Render-Typen festlegen, bevor Sie Ihr Modell zeichnen, da SpriteBatch.Begin () das Render-Element automatisch in DepthStencilState.None und BlendState.AlphaBlend ändert (siehe MSDN-Dokumentation für SpriteBatch.Begin ).

    
Empyrean 15.02.2011, 01:44
quelle
3

Lösung ist die folgende vor Ihrem 3D-Render-Code hinzufügen:

%Vor%     
David D. 12.08.2011 14:06
quelle
1

Ich habe diesen Code getestet, bevor ich ihn gepostet habe. Wenn Sie einen neuen DepthStencilState erstellen, können Sie die GraphicsDevice-Eigenschaft wie folgt auf Ihren neuen Status setzen:

%Vor%     
Darkhydro 15.02.2011 01:40
quelle
0

Wie Empyrean gesagt hat, müssen Sie die folgende Codezeile direkt über dem Code platzieren, den Sie zum Zeichnen Ihres Modells in der Draw () - Funktion verwenden:

  

GraphicsDevice.DepthStencilState =   DepthStencilState.Default;

    
Mark Dunne 09.03.2011 00:01
quelle

Tags und Links