Billboard disegna bene su PC, non su XBOX


8

La luna è disegnata con due richiami di pareggio, ma entrambi disegnano in modo errato su xbox, quindi sto solo mostrando un pareggio per semplicità.


Ecco come dovrebbe apparire la luna sul PC:

inserisci qui la descrizione dell'immagine

Come appare sull'XBOX:

inserisci qui la descrizione dell'immagine

La trama sfarfalla, scompare, sembra una sfumatura dal basso verso l'alto, le linee la attraversano e così via mentre la telecamera si muove. Ad esempio, dopo aver spostato leggermente la fotocamera, appare così: 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); 
} 

Ecco lo shader usato, niente di complicato qui: http://www.olhovsky.com/xna/Moon.fx

Qualcuno sa perché la trama non viene visualizzata correttamente su xbox? C'è forse un altro stato che dovrei impostare?


A meno che tu non lo stia facendo in DrawQuad, non stai impostando esplicitamente la trama per la luna.
r2d2rigo,

@ r2d2rigo: viene impostato una volta al momento del caricamento sull'effetto clonato "_moonEffect2" e quindi non reimpostato mai, poiché è più efficiente.
Olhovsky

Risposte:


4

La soluzione era rimuovere l'input di colore inutilizzato dallo shader.

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

Nuovo pixel shader:

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

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

    return color;
}

Qualche idea sul perché questo sia?
Jonathan Connell,

Su Xbox 360, non associare nulla all'input di colore è probabilmente come avere un puntatore a un valore non inizializzato. Quindi puoi avere valori casuali invece di un valore predefinito (zero), come nel caso di Windows. In effetti, potrebbero non essere tutte le GPU di Windows che hanno questo comportamento. È possibile che alcune GPU di Windows mostrino anche il comportamento di xbox. Comunque, non vuoi avere input inutilizzati comunque, per motivi di prestazioni, quindi non è poi così male.
Olhovsky,

Concordato. Solo l'immagine di output mi sembra strana, poiché non stai usando l'attributo color nello shader reale. Forse l'output è contiguo dopo l'input, e quindi il 'colore' non legato sovrascrive il colore di uscita? Non so: p
Jonathan Connell,

Ora che osservo più da vicino il mio shader, la mia spiegazione ha poco senso. Il colorvalore viene impostato da una trama prima di essere utilizzato in entrambi i modi, quindi il valore iniziale di colornon dovrebbe avere importanza. Non so perché questo accada. La morale, tuttavia, non è quella di avere input inutilizzati per la tua funzione shader.
Olhovsky,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.