Làm thế nào để tôi thực hiện Alpha minh bạch đúng cách trong XNA 4.0?


14

Được rồi, tôi đã đọc một số bài viết, hướng dẫn và câu hỏi liên quan đến điều này. Hầu hết chỉ đến cùng một kỹ thuật không giải quyết được vấn đề của tôi. Tôi cần khả năng tạo các họa tiết bán trong suốt (thật sự của texture2D) và để chúng phủ lên một sprite khác.

Tôi có thể đạt được điều đó với các mẫu mã tôi đã tìm thấy nhưng tôi không hài lòng với kết quả này và tôi biết có một cách để làm điều này. Trong lập trình di động (BREW), chúng tôi đã thực hiện trường cũ và thực sự kiểm tra từng pixel cho độ trong suốt trước khi kết xuất.

Trong trường hợp này, nó dường như làm cho sprite bên dưới nó hòa trộn với alpha ở trên nó. Đây có thể là một sự giả tạo về cách tôi vẽ kết cấu nhưng, như tôi đã nói trước đây, tất cả các ví dụ đều chỉ ra một kỹ thuật này. Trước khi tôi đi xa hơn, tôi sẽ tiếp tục và dán mã ví dụ của mình.

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

    }

Như bạn có thể thấy, trong mã này, tôi đang sử dụng phương thức SpriteBatch.Begin đã quá tải, trong số những thứ khác, trạng thái pha trộn. Tôi gần như tích cực đó là vấn đề của tôi. Tôi không muốn BLEND các sprite, tôi muốn chúng trong suốt khi alpha bằng 0. Trong ví dụ này tôi có thể đặt alpha thành 0 nhưng nó vẫn hiển thị cả hai ô, với sprite dưới z được hiển thị, bị đổi màu vì pha trộn. Đây không phải là một hiệu ứng mong muốn, tôi muốn sprite theo thứ tự z cao hơn mờ dần và không ảnh hưởng đến màu bên dưới nó theo cách như vậy.

Tôi có thể rời khỏi đây vì tôi còn khá mới đối với sự phát triển của XNA vì vậy hãy thoải mái điều khiển tôi đi đúng hướng trong trường hợp tôi đi xuống hố thỏ sai.

TIA


Tại sao nó là "đúng" alpha? Có hỗ trợ alpha, và không có hỗ trợ alpha, phải không?
Vịt Cộng sản

Bạn sẽ có thể chỉnh sửa tiêu đề bằng cách nhấn 'chỉnh sửa' và sau đó tiêu đề phải ở trên cùng. Trừ khi có gì đó thay đổi.
Vịt Cộng sản

Câu trả lời:


18

Nếu tôi thực hiện đúng vấn đề, hãy thử gọi Bắt đầu với BlendState.NonPremultiplied. Bài viết này cũng có thể giúp làm sáng tỏ về cách thức trộn alpha hoạt động trong XNA:

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


Đúng, có vẻ như NonPremultiplied sẽ thực hiện thủ thuật (ít nhất là theo liên kết bạn đã đăng). Tôi sẽ chờ xem liệu nó có hoạt động khi tôi về nhà tối nay trước khi chấp nhận không nhưng có vẻ như đây là câu trả lời. Cảm ơn!
Soshimo

đó là mẹo Tôi đã không nhận ra họ đã thay đổi điều đó trong 4.0. Bài viết mà bạn liên kết là rất minh họa. Cảm ơn bạn.
ITEimo

1
+1 Cảm ơn bạn! Tôi chỉ đang tìm kiếm trực tuyến cố gắng tìm hiểu tại sao alpha chỉ hoạt động một phần. Điều này đã giải quyết nó. Các thuật ngữ tôi đang sử dụng trên google là Spritebatch Opacity, hy vọng những thuật ngữ đó sẽ giúp các gogglers tìm thấy câu trả lời này.
Tấn côngHobo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.