2010-12-15 6 views
0

Das macht mich irgendwie frustrierend, da ich seit ein paar Stunden darüber herumbastle.3D in Front/Hinter Sprites in XNA/WP7 zeichnen?

Grundsätzlich zeichne ich 2D-Sprites durch spritebatch und 3D orthographisch projizierte Geometrie mit der BasicEffect-Klasse.

Mein Problem ist zu kontrollieren, was auf was gerendert wird. Zuerst dachte ich, es wäre einfach die Reihenfolge machen zu steuern, das heißt, wenn ich tue:

Draw3DStuff() 

SpriteBatch.Begin(...) 
Draw2DStuff(); 
SpriteBatch.End(); 

Es wäre das 2D-Material bedeuten würde, über die 3D-Sachen machen, aber da ich nicht kontrollieren, wenn das Gerät beginnt/Enden macht dies nicht das Ergebnis. Die 3D-Darstellung erfolgt immer über den 2D-Elementen, unabhängig von den Projektionseinstellungen, der Weltverschiebung, den z-Komponenten der Vertexdefinitionen für 3D-Geometrien und der Ebenentiefe der 2D-Elemente.

Gibt es etwas, auf das ich hier nicht eingehe? Was ist der richtige Weg, um die Tiefe hier zu behandeln?

+0

Sie könnten einen Stich über bei gamedev.stackexchange.com haben – Nate

+1

In Ihrem 'Begin'-Aufruf verwenden Sie nicht etwas * anderes * als' DepthStencilState.None', bist du? –

Antwort

4

OK Ich habe es 2 Sekunden nach dem Posten dieser Frage herausgefunden. Ich weiß nicht, ob es Zufall war oder ob StackOverflow über eine neue Funktion verfügt, die es ermöglicht, zukünftige Antworten zu sehen.

Die Z-Position von Sprite-Batch-Elementen liegt zwischen 0 und 1, sodass sie nicht direkt mit den z-Positionen der orthographischen Geometrie vergleichbar sind.

Wenn Sie eine orthographische Matrix erstellen, definieren Sie jedoch eine nahe und eine ferne Schnittebene. Die von Ihnen eingestellte Z-Position sollte innerhalb dieser Clip-Ebene liegen. Ich hatte eine Ahnung, dass die Spritebatch-Klasse Quadrate effektiv orthogonal zeichnet, also dass 0 zu 1 bedeuten würde, dass 0 einen nahen Clip und 1 einen fernen Clip darstellt und die Tiefe wahrscheinlich an derselben Stelle gerendert wurde wie die 3D-Geometrietiefe zu gerendert werden.

Soooo, damit es funktioniert Ich habe mir gedacht, dass die Near/Fare - Clips, die ich für den orthographischen Renderer definiert habe, an den nahen/fernen Clips der Sprites gemessen werden, also war es einfach eine Einstellung rechts z-Wert, also zum Beispiel:

Wenn ich einen nahen Clip von 0 und einen fernen Clip von 10000 habe und ich es so zeichnen wollte, dass es 0.5f Schichttiefe entsprechen würde und rendern vor Sprites gezeichnet werden bei 0,6 und hinter Sprites bei 0,4 gezogen wird ich tun:

float zpos = 0.5f; 
    float orthoGraphicZPos = LinearInterpolate(0, 10000, zpos); 

Oder ZPOS nur * 10000: D

Ich denke, es wäre sinnvoller, wenn Ihre orthographischen Renderer nah/fern als 0 und 1 dargestellt werden, um sie direkt mit den Tiefen der Sprites-Ebenen zu vergleichen.

Hoffentlich war meine Argumentation für diese Lösung richtig (mehr oder weniger).

2

Als Nebenbei bemerkt, da Sie erwähnt haben, hatten Sie eine Ahnung davon, wie die Sprite Charge Quads zeichnete. Sie können den Quellcode für alle default/enthalten Shadern und die Spritebatch-Klasse, wenn Sie neugierig sind, oder die Hilfe benötigen, ein Problem wie dieses zu lösen:
http://create.msdn.com/en-US/education/catalog/sample/stock_effects

1

Das Problem ist, dass die Spritebatch Verwirrungen mit einigen der renderstates Diese werden verwendet, wenn Sie Ihre 3D-Objekte zeichnen. Um dies zu beheben, müssen Sie sie nur zurücksetzen, bevor Sie Ihre 3D-Objekte so rendern.

Beachten Sie, dass dies für XNA 4.0 ist, die ich ziemlich sicher bin, dass Sie sowieso verwenden. Weitere Informationen finden Sie unter shawn hargreaves blog here. Dadurch werden die Render-Zustände zurückgesetzt, die 3D-Objekte gezeichnet und dann die 2D-Objekte über sie gezeichnet. Ohne die Render-Zustände zurückzusetzen, bekommst du seltsame Effekte wie dein Sehen.