A lua é desenhada com duas chamadas de empate, mas as duas estão erradas no xbox, por isso estou exibindo apenas uma para simplificar.
É assim que a lua deve ficar no PC:
Como fica no XBOX:
A textura pisca, desaparece, parece um gradiente de baixo para cima, linhas passam por ele e assim por diante enquanto a câmera se move. Por exemplo, depois de mover a câmera levemente, fica assim: 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);
}
Aqui está o shader usado, nada complicado aqui: http://www.olhovsky.com/xna/Moon.fx
Alguém sabe por que a textura não está sendo exibida corretamente no xbox? Existe outro estado que eu deveria estar definindo, talvez?
Respostas:
A solução foi remover a entrada de cores não utilizada do shader.
Shader de pixel antigo:
Novo pixel shader:
fonte
color
valor é definido a partir de uma textura antes de ser usado de qualquer maneira, portanto, o valor inicial decolor
não deve importar. Não sei por que isso acontece. A moral, porém, é não ter entradas não utilizadas para sua função de sombreador.