Billboard dibuja bien en PC, no en XBOX

8

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:

ingrese la descripción de la imagen aquí

Cómo se ve en la XBOX:

ingrese la descripción de la imagen aquí

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?

Olhovsky
fuente
A menos que lo esté haciendo en DrawQuad, no está configurando explícitamente la textura de la luna.
r2d2rigo
@ r2d2rigo: se configura una vez al momento de la carga en el efecto clonado "_moonEffect2" y luego nunca se configura nuevamente, ya que es más eficiente.
Olhovsky 01 de

Respuestas:

4

La solución fue eliminar la entrada de color no utilizada del sombreador.

Viejo sombreador de píxeles:

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

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

    return color;
}

Nuevo sombreador de píxeles:

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

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

    return color;
}
Olhovsky
fuente
¿Alguna idea de por qué es esto?
Jonathan Connell
En el xbox 360, no vincular nada a la entrada de color es probablemente tener un puntero a un valor no inicializado. Entonces puede tener valores aleatorios en lugar de un valor predeterminado (cero), que es el caso en Windows. De hecho, puede que no todas las GPU de Windows tengan ese comportamiento. Es posible que algunas GPU de Windows también exhiban el comportamiento de xbox. De todos modos, no desea tener entradas no utilizadas de todos modos, por razones de rendimiento, por lo que no es tan malo.
Olhovsky
Convenido. Solo la imagen de salida me parece extraña, ya que no está utilizando el atributo de color en el sombreador real. ¿Tal vez la salida es contigua después de la entrada, por lo que el 'color' no enlazado sobrescribe el color de salida? No sé: p
Jonathan Connell
Ahora que miro más de cerca mi sombreador, mi explicación tiene poco sentido. El colorvalor se establece a partir de una textura antes de usarse de cualquier manera, por lo que el valor inicial de colorno 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.
Olhovsky