Alfa Şeffaflığı XNA 4.0 Nasıl Düzgün Yaparım?


14

Tamam, bununla ilgili birkaç makale, öğretici ve soru okudum. Çoğu sorunumu çözmeyen aynı tekniğe işaret ediyor. Yarı saydam spritelar (texture2D's gerçekten) oluşturma ve onlara başka bir sprite yerleştirme yeteneğine ihtiyacım var.

Bulduğum kod örnekleri ile biraz başarabilirim ama sonuçlardan memnun değilim ve bunu yapmanın bir yolu olduğunu biliyorum. Mobil programlamada (BREW) eski okulu yaptık ve renderlemeden önce her pikseli şeffaflık açısından kontrol ettik.

Bu durumda altındaki sprite'ı üstündeki alfa ile karıştırılmış gibi görünüyor. Bu, dokuyu nasıl oluşturduğumun bir ürünü olabilir, ancak daha önce söylediğim gibi, tüm örnekler bu tekniğe işaret ediyor. Daha ileri gitmeden önce örnek kodumu yapıştıracağım.

    public void Draw(SpriteBatch batch, Camera camera, float alpha)
    {
        int tileMapWidth = Width;
        int tileMapHeight = Height;

        batch.Begin(SpriteSortMode.Texture,
            BlendState.AlphaBlend,
            SamplerState.PointWrap,
            DepthStencilState.Default,
            RasterizerState.CullNone,
            null, camera.TransformMatrix);

        for (int x = 0; x < tileMapWidth; x++)
        {
            for (int y = 0; y < tileMapHeight; y++)
            {
                int tileIndex = _map[y, x];

                if (tileIndex != -1)
                {
                    Texture2D texture = _tileTextures[tileIndex];

                    batch.Draw(
                        texture,
                        new Rectangle(
                            (x * Engine.TileWidth),
                            (y * Engine.TileHeight),
                            Engine.TileWidth,
                            Engine.TileHeight),
                        new Color(new Vector4(1f, 1f, 1f, alpha )));
                }
            }
        }

        batch.End();

    }

Gördüğünüz gibi, bu kodda, diğer şeylerin yanı sıra, bir karışım durumunu alan aşırı yüklenmiş SpriteBatch.Begin yöntemini kullanıyorum. Bu benim sorunum neredeyse pozitif. Spriteları karıştırmak istemiyorum, alfa 0 olduğunda saydam olmalarını istiyorum. Bu örnekte alfa'yı 0 olarak ayarlayabilirim, ancak yine de her iki döşemeyi de oluşturur, çünkü alt z sıralı sprite, harmanlama. Bu istenen bir etki değil, daha yüksek z-emri hareketli grafiğin solmasını ve altındaki rengi bu şekilde etkilememesini istiyorum.

XNA gelişimi için oldukça yeni olduğum için burada olabilirim, bu yüzden yanlış tavşan deliğine inmem durumunda beni doğru yönde yönlendirmekten çekinmeyin.

TIA


Neden 'uygun' alfa? Alfa desteği var ve alfa desteği yok, değil mi?
Komünist Ördek

'Düzenle'ye basarak başlığı düzenleyebilmeniz ve ardından başlığın üstte olması gerekir. Bir şey değişmedikçe.
Komünist Ördek

Yanıtlar:


18

Sorunu doğru bir şekilde izlersem, Begin with BlendState.NonPremultiplied öğesini çağırmayı deneyin. Bu makale ayrıca XNA'da alfa harmanlamanın nasıl çalıştığına ışık tutmaya yardımcı olabilir:

https://web.archive.org/web/20130208130323/http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4- 0.aspx


Evet, görünüşe göre NonPremultiplied hile yapacak (en azından yayınladığınız bağlantıya göre). Bekleyeceğim ve kabul etmeden önce bu gece eve geldiğimde işe yarayıp yaramayacağını göreceğim ama cevap bu gibi görünüyor. Teşekkürler!
Soshimo

hüner buydu. Bunu 4.0'da değiştirdiklerinin farkında değildim. Bağladığınız makale çok açıklayıcıydı. Teşekkür ederim.
Soshimo

1
+1 Teşekkürler! Alfa'nın neden sadece kısmen çalıştığını anlamaya çalışırken sadece çevrimiçi bakıyordum. Bu çözdü. Google'da kullandığım terimler Spritebatch Opacity idi, umarım bu terimler artık gogglers'ın bu cevabı bulmasına yardımcı olacaktır.
AttackingHobo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.