Le panneau d'affichage tire bien sur PC, pas sur XBOX

8

La lune est dessinée avec deux appels de tirage, mais les deux dessinent mal sur la xbox, donc je n'affiche qu'un seul tirage pour plus de simplicité.


Voici à quoi devrait ressembler la lune sur le PC:

entrez la description de l'image ici

À quoi ça ressemble sur la XBOX:

entrez la description de l'image ici

La texture scintille, disparaît, ressemble à un dégradé de bas en haut, des lignes la parcourent, et ainsi de suite lorsque la caméra se déplace. Par exemple, après avoir légèrement déplacé la caméra, cela ressemble à ceci: 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); 
} 

Voici le shader utilisé, rien de compliqué ici: http://www.olhovsky.com/xna/Moon.fx

Est-ce que quelqu'un sait pourquoi la texture ne s'affiche pas correctement sur la Xbox? Y a-t-il un autre état que je devrais définir peut-être?

Olhovsky
la source
À moins que vous ne le fassiez dans DrawQuad, vous ne définissez pas explicitement la texture de la lune.
r2d2rigo
@ r2d2rigo: Il est défini une fois au moment du chargement sur l'effet cloné "_moonEffect2", puis n'est plus défini, car cela est plus efficace.
Olhovsky

Réponses:

4

La solution consistait à supprimer les entrées de couleur inutilisées du shader.

Ancien 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;
}

Nouveau 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
la source
Une idée pourquoi c'est?
Jonathan Connell
Sur la Xbox 360, ne rien lier à l'entrée de couleur revient probablement à avoir un pointeur sur une valeur non initialisée. Ensuite, vous pouvez avoir des valeurs aléatoires au lieu d'une valeur par défaut (zéro), ce qui est le cas sous Windows. En fait, ce ne sont peut-être pas tous les GPU Windows qui ont ce comportement. Il est possible que certains GPU Windows présentent également le comportement xbox. Quoi qu'il en soit, vous ne voulez pas avoir d'entrées inutilisées de toute façon, pour des raisons de performances, donc ce n'est pas si mal.
Olhovsky
D'accord. Seule l'image de sortie me semble bizarre, car vous n'utilisez pas l'attribut de couleur dans le shader réel. Peut-être que la sortie est contiguë après l'entrée, et donc la «couleur» non liée écrase la couleur de sortie? Je ne sais pas: p
Jonathan Connell
Maintenant que je regarde de plus près mon shader, mon explication n'a plus de sens. La colorvaleur est définie à partir d'une texture avant d'être utilisée de toute façon, la valeur initiale de colorne devrait donc pas avoir d'importance. Je ne sais pas pourquoi cela se produit. La morale, cependant, n'est pas d'avoir des entrées inutilisées pour votre fonction de shader.
Olhovsky