ฉันจะทำอัลฟ่าโปร่งใสอย่างถูกต้องใน XNA 4.0 ได้อย่างไร


14

โอเคฉันได้อ่านบทความบทช่วยสอนและคำถามเกี่ยวกับเรื่องนี้แล้ว ส่วนใหญ่ชี้ไปที่เทคนิคเดียวกันซึ่งไม่ได้แก้ปัญหาของฉัน ฉันต้องการความสามารถในการสร้างสไปรต์แบบกึ่งโปร่งใส (ของ texture2D จริงๆ) และให้สไปรต์ซ้อนทับอีก

ฉันสามารถทำได้โดยใช้ตัวอย่างโค้ดที่ฉันพบ แต่ฉันไม่พอใจกับผลลัพธ์และฉันรู้ว่ามีวิธีในการทำเช่นนี้ ในการเขียนโปรแกรมมือถือ (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 ด้านล่างสั่งสไปรท์ การผสม นี่ไม่ใช่เอฟเฟกต์ที่ต้องการฉันต้องการสไปรต์ที่สั่ง z สูงกว่าจะจางหายไปและไม่มีผลกับสีที่อยู่ด้านล่างในลักษณะดังกล่าว

ฉันอาจจะออกจากที่นี่เพราะฉันค่อนข้างใหม่กับการพัฒนา XNA ดังนั้นอย่าลังเลที่จะนำทางฉันไปในทิศทางที่ถูกต้องในกรณีที่ฉันลงหลุมกระต่ายที่ไม่ถูกต้อง

TIA


ทำไมอัลฟ่า 'ถูกต้อง' มีการสนับสนุนอัลฟ่าและไม่มีการสนับสนุนอัลฟาใช่ไหม?
The Duck Communist

คุณควรจะสามารถแก้ไขชื่อโดยกด 'แก้ไข' แล้วชื่อควรจะอยู่ด้านบน นอกเสียจากว่ามีอะไรเปลี่ยนแปลง
The Duck Communist

คำตอบ:


18

ถ้าฉันทำตามปัญหาอย่างถูกต้องลองโทร Begin ด้วย BlendState.NonPremultiplied บทความนี้อาจช่วยให้เข้าใจถึงวิธีการผสม alpha ทำงานใน XNA:

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


ใช่ดูเหมือนว่า NonPremultiplied จะทำตามเคล็ดลับ (อย่างน้อยตามลิงก์ที่คุณโพสต์) ฉันจะรอและดูว่ามันทำงานเมื่อฉันกลับถึงบ้านคืนนี้ก่อนที่จะยอมรับ แต่ดูเหมือนว่านี่คือคำตอบ ขอบคุณ!
Soshimo

นั่นคือเคล็ดลับ ฉันไม่รู้ว่าพวกเขาเปลี่ยนมันใน 4.0 บทความที่คุณเชื่อมโยงนั้นเป็นตัวอย่างที่ดีมาก ขอขอบคุณ.
Soshimo

1
+1 ขอบคุณ! ฉันแค่กำลังมองหาออนไลน์พยายามหาสาเหตุว่าทำไมอัลฟาจึงทำงานเพียงบางส่วน สิ่งนี้แก้ไขได้ คำที่ฉันใช้บน google คือ Spritebatch Opacity หวังว่าข้อกำหนดเหล่านี้จะช่วยให้ผู้ค้นพบคำตอบนี้ได้
AttackHobo

6

เห็นด้วยอย่างเต็มที่กับการตอบสนองของอเล็กซ์ แต่ถ้าคุณยึดติดกับอัลฟ่าก่อนวัยอันควรฉันเชื่อว่าคุณสามารถทำได้เช่นนี้

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

Shawn ยังได้โพสต์อธิบายถึงความแตกต่างระหว่างอัลฟาที่ไม่ได้มีการคูณและไม่คูณ - http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.