Billboard menarik baik di PC, bukan di XBOX

8

Bulan digambar dengan dua panggilan undian, tetapi keduanya menggambar salah di xbox jadi saya hanya menampilkan satu undian untuk kesederhanaan.


Beginilah tampilan bulan di PC:

masukkan deskripsi gambar di sini

Bagaimana tampilannya di XBOX:

masukkan deskripsi gambar di sini

Tekstur berkedip, menghilang, tampak seperti gradien dari bawah ke atas, garis-garis melewatinya, dan seterusnya ketika kamera bergerak. Misalnya setelah memindahkan kamera sedikit terlihat seperti ini: 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); 
} 

Berikut adalah shader yang digunakan, tidak ada yang rumit di sini: http://www.olhovsky.com/xna/Moon.fx

Adakah yang tahu mengapa tekstur tidak ditampilkan dengan benar di xbox? Apakah ada keadaan lain yang mungkin harus saya atur?

Olhovsky
sumber
Kecuali Anda melakukannya di DrawQuad, Anda tidak secara eksplisit mengatur tekstur untuk bulan.
r2d2rigo
@ r2d2rigo: Diatur satu kali pada waktu buka pada efek yang dikloning "_moonEffect2" dan kemudian tidak pernah diatur lagi, karena itu lebih efisien.
Olhovsky

Jawaban:

4

Solusinya adalah menghapus input warna yang tidak digunakan dari shader.

Shader piksel lama:

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

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

    return color;
}

Pixer shader baru:

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

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

    return color;
}
Olhovsky
sumber
Ada yang tahu ini kenapa?
Jonathan Connell
Pada xbox 360, tidak mengikat apa pun ke input warna mungkin sama dengan memiliki pointer ke nilai yang tidak diinisialisasi. Kemudian Anda dapat memiliki nilai acak, bukan nilai default (nol), yang merupakan kasus di windows. Bahkan, mungkin tidak semua GPU windows yang memiliki perilaku itu. Mungkin saja beberapa windows GPU juga memperlihatkan perilaku xbox. Lagi pula, Anda tidak ingin memiliki input yang tidak digunakan, karena alasan kinerja, jadi tidak terlalu buruk.
Olhovsky
Sepakat. Hanya gambar output yang terlihat aneh bagi saya, karena Anda tidak menggunakan atribut warna pada shader yang sebenarnya. Mungkin output berdekatan setelah input, dan 'warna' yang tidak mengikat menimpa warna ouput? Saya tidak tahu: p
Jonathan Connell
Sekarang saya melihat lebih dekat pada shader saya, penjelasan saya tidak masuk akal. The colornilai diatur dari tekstur sebelum digunakan dengan cara baik, sehingga nilai awal colorseharusnya tidak masalah. Saya tidak tahu mengapa ini terjadi. Namun moral, adalah tidak memiliki input yang tidak digunakan untuk fungsi shader Anda.
Olhovsky