Quadro de avisos desenha bem no PC, não no XBOX

8

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:

insira a descrição da imagem aqui

Como fica no XBOX:

insira a descrição da imagem aqui

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?

Olhovsky
fonte
A menos que você esteja fazendo isso no DrawQuad, não está definindo explicitamente a textura para a lua.
R2d2rigo 28/03
@ r2d2rigo: é definido uma vez no tempo de carregamento no efeito clonado "_moonEffect2" e nunca é definido novamente, pois é mais eficiente.
Olhovsky

Respostas:

4

A solução foi remover a entrada de cores não utilizada do shader.

Shader de pixel antigo:

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

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

    return color;
}

Novo 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
fonte
Alguma ideia de por que é assim?
Jonathan Connell
No xbox 360, não vincular nada à entrada de cores provavelmente é semelhante a ter um ponteiro para um valor não inicializado. Em seguida, você pode ter valores aleatórios em vez de um valor padrão (zero), como é o caso no Windows. De fato, talvez não sejam todas as GPUs do Windows que tenham esse comportamento. É possível que algumas GPUs do Windows também exibam o comportamento do Xbox. De qualquer forma, você não deseja ter entradas não utilizadas, por motivos de desempenho, por isso não é tão ruim.
Olhovsky
Acordado. Apenas a imagem de saída parece estranha para mim, pois você não está usando o atributo color no shader real. Talvez a saída seja contígua após a entrada e, portanto, a 'cor' desatada substitua a cor de saída? Eu não sei: p
Jonathan Connell
Agora que olho mais de perto meu shader, minha explicação faz pouco sentido. O colorvalor é definido a partir de uma textura antes de ser usado de qualquer maneira, portanto, o valor inicial de colornã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.
Olhovsky