Billboard zeichnet gut auf PC, nicht auf XBOX

8

Der Mond wird mit zwei Draw-Aufrufen gezeichnet, aber beide zeichnen auf der Xbox falsch, sodass ich der Einfachheit halber nur einen Draw anzeige.


So sollte der Mond auf dem PC aussehen:

Geben Sie hier die Bildbeschreibung ein

Wie es auf der XBOX aussieht:

Geben Sie hier die Bildbeschreibung ein

Die Textur flackert, verschwindet, sieht aus wie ein Farbverlauf von unten nach oben, Linien verlaufen durch sie usw., während sich die Kamera bewegt. Zum Beispiel sieht es nach leichtem Bewegen der Kamera folgendermaßen aus: http://olhovsky.com/xna/xbox_moon2.png

public void Draw(Camera cam) 
{ 
    GraphicsDevice gd = Game3.GDM.GraphicsDevice; 

    Vector3 position = Position + cam.Position; 
    Matrix world = Matrix.CreateScale(2.0f); 
    world *= Matrix.CreateConstrainedBillboard( 
    position, cam.Position, Vector3.Down, cam.Forward, null); 

    _moonEffect2.Parameters["World"].SetValue(world); 
    _moonEffect2.Parameters["View"].SetValue(cam.View); 
    _moonEffect2.Parameters["Projection"].SetValue(cam.Projection); 

    // Draw blended part of moon only. 
    _moonEffect2.Parameters["AlphaTestDirection"].SetValue(-1); 
    gd.BlendState = BlendState.AlphaBlend; 
    gd.RasterizerState = RasterizerState.CullNone; 
    gd.DepthStencilState = DepthStencilState.DepthRead; 
    ScreenQuadDraw.DrawQuad(_moonQuad, _moonEffect2); 
} 

Hier wird der Shader verwendet, hier nichts kompliziertes: http://www.olhovsky.com/xna/Moon.fx

Weiß jemand, warum die Textur auf der Xbox nicht richtig angezeigt wird? Gibt es einen anderen Zustand, den ich vielleicht einstellen sollte?

Olhovsky
quelle
Sofern Sie dies nicht in DrawQuad tun, legen Sie die Textur für den Mond nicht explizit fest.
r2d2rigo
@ r2d2rigo: Wird beim Laden einmal auf den geklonten Effekt "_moonEffect2" gesetzt und dann nie wieder gesetzt, da dies effizienter ist.
Olhovsky

Antworten:

4

Die Lösung bestand darin, die nicht verwendete Farbeingabe aus dem Shader zu entfernen.

Alter Pixel-Shader:

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0, float4 color : COLOR0) : COLOR0
{
    color = tex2D(TextureSampler, texCoord);

    // Apply the alpha test.
    clip((color.a - AlphaTestThreshold) * AlphaTestDirection);

    return color;
}

Neuer Pixel Shader:

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
    float4 color = tex2D(TextureSampler, texCoord);

    // Apply the alpha test.
    clip((color.a - AlphaTestThreshold) * AlphaTestDirection);

    return color;
}
Olhovsky
quelle
Irgendeine Idee warum das so ist?
Jonathan Connell
Wenn Sie auf der Xbox 360 nichts an die Farbeingabe binden, entspricht dies wahrscheinlich einem Zeiger auf einen nicht initialisierten Wert. Dann können Sie zufällige Werte anstelle eines Standardwerts (Null) verwenden, wie dies bei Windows der Fall ist. Möglicherweise weisen nicht alle Windows-GPUs dieses Verhalten auf. Es ist möglich, dass einige Windows-GPUs auch das Xbox-Verhalten aufweisen. Auf jeden Fall möchten Sie aus Leistungsgründen sowieso keine unbenutzten Eingaben haben, also ist es nicht so schlimm.
Olhovsky
Einverstanden. Nur das Ausgabebild erscheint mir seltsam, da Sie das Farbattribut im eigentlichen Shader nicht verwenden. Vielleicht ist die Ausgabe nach der Eingabe zusammenhängend, und so überschreibt die ungebundene 'Farbe' die Ausgabefarbe? Ich weiß nicht: p
Jonathan Connell
Jetzt, wo ich meinen Shader genauer betrachte, macht meine Erklärung wenig Sinn. Der colorWert wird aus einer Textur festgelegt, bevor er in irgendeiner Weise verwendet wird, sodass der Anfangswert von colorkeine Rolle spielen sollte. Ich weiß nicht, warum das passiert. Die Moral ist jedoch, keine unbenutzten Eingaben für Ihre Shader-Funktion zu haben.
Olhovsky