La luna se dibuja con dos llamadas de sorteo, pero ambas dibujan mal en el xbox, así que solo estoy mostrando un sorteo por simplicidad.
Así debería verse la luna en la PC:
Cómo se ve en la XBOX:
La textura parpadea, desaparece, se ve como un gradiente de abajo hacia arriba, las líneas la atraviesan, y así sucesivamente a medida que la cámara se mueve. Por ejemplo, después de mover la cámara ligeramente, se ve así: 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);
}
Aquí está el sombreador utilizado, nada complicado aquí: http://www.olhovsky.com/xna/Moon.fx
¿Alguien sabe por qué la textura no se muestra correctamente en el xbox? ¿Hay otro estado que tal vez debería establecer?
Respuestas:
La solución fue eliminar la entrada de color no utilizada del sombreador.
Viejo sombreador de píxeles:
Nuevo sombreador de píxeles:
fuente
color
valor se establece a partir de una textura antes de usarse de cualquier manera, por lo que el valor inicial decolor
no debería importar. No sé por qué sucede esto. Sin embargo, la moraleja es no tener entradas no utilizadas para la función de sombreador.