Як правильно зробити прозорість альфа-версії в XNA 4.0?


14

Гаразд, я прочитав кілька статей, навчальних посібників та запитань з цього приводу. Більшість вказує на ту саму методику, яка не вирішує мою проблему. Мені потрібна здатність створювати напівпрозорі спрайти (текстури дійсно) і накладати їх на інший спрайт.

Я можу досягти цього дещо за допомогою знайдених зразків коду, але я не задоволений результатами, і я знаю, що є спосіб це зробити. У програмах мобільного програмування (BREW) ми зробили це в старій школі та фактично перевірили прозорість кожного пікселя перед рендерінгом.

У цьому випадку, здається, спрайт спрайту під ним змішується з альфаю над ним. Це може бути артефактом того, як я рендерую текстуру, але, як я вже говорив раніше, всі приклади вказують на цю одну техніку. Перш ніж піти далі, я продовжую вставляти зразок коду.

    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();

    }

Як ви бачите, у цьому коді я використовую перевантажений метод SpriteBatch.Begin, який, серед іншого, приймає стан змішування. Я майже впевнений, що це моя проблема. Я не хочу БЛІНТУВАТИ спрайт, я хочу, щоб вони були прозорими, коли альфа дорівнює 0. У цьому прикладі я можу встановити альфа на 0, але вона все одно відображає обидві плитки, а нижній z упорядкований спрайт відображається, знебарвлюється через змішування. Це не бажаний ефект, я хочу, щоб вищий з упорядкованим спрайтом зникав і не впливав на колір під ним таким чином.

Я можу бути далеко від цього, оскільки я досить новачок у розвитку XNA, тому не соромтесь направляти мене в правильному напрямку, якщо я спускаюся з неправильної кролячої нори.

ТІА


Чому це "правильна" альфа? Там є альфа-підтримка, а альфа-підтримки немає, правда?
Качка комуніста

Ви маєте змогу редагувати заголовок, натиснувши "редагувати", а потім заголовок повинен знаходитися вгорі. Якщо щось не змінилося.
Качка комуністична

Відповіді:


18

Якщо я правильно дотримуюся проблеми, спробуйте зателефонувати Почати з BlendState.NonPremultipted. Ця стаття може також допомогти пролити трохи інформації про те, як працює суміш альфа в XNA:

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


Так, схоже, що NonPremultipted збирається зробити трюк (принаймні, за посиланням, яке ви опублікували). Я збираюся зачекати і побачити, чи спрацює це, коли я повернусь додому сьогодні, перш ніж приймати, але, схоже, це відповідь. Спасибі!
Сосімо

в цьому і був трюк. Я не розумів, що вони змінили це в 4.0. Ця стаття, яку ви зв'язали, була дуже показовою. Дякую.
Сосімо

1
+1 Дякую! Я просто дивився в Інтернеті, намагаючись з’ясувати, чому альфа працює лише частково. Це вирішило це. Терміни, якими я користувався в Google, були непрозорістю Spritebatch, сподіваємось, ці терміни тепер допоможуть гоглерам знайти цю відповідь.
Атака

6

Повністю згоден з відповіддю Алекса, хоча якщо ви дотримуєтесь попередньо розмноженої альфа, я вважаю, що ви могли б зробити це і таким чином

new Color(new Vector4(alpha, alpha, alpha, alpha ))

Шон також створив публікацію, в якій пояснив різницю між попередньо розмноженою та нерозмноженою альфа - http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultided-alpha.aspx

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.