मैं XNA 4.0 में अल्फा ट्रांसपेरेंसी को ठीक से कैसे करूँ?


14

ठीक है, मैंने इस बारे में कई लेख, ट्यूटोरियल और प्रश्न पढ़े हैं। अधिकांश उसी तकनीक की ओर इशारा करते हैं जो मेरी समस्या का समाधान नहीं करती है। मुझे अर्ध-पारदर्शी स्प्राइट्स बनाने की क्षमता की आवश्यकता है (बनावट 2 डी वास्तव में) और उन्हें एक और स्प्राइट ओवरले करें।

मुझे लगता है कि कोड नमूने के साथ कुछ हासिल कर सकता हूं, लेकिन मैं परिणामों से संतुष्ट नहीं हूं और मुझे पता है कि ऐसा करने का एक तरीका है। मोबाइल प्रोग्रामिंग (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();

    }

जैसा कि आप देख सकते हैं, इस कोड में मैं ओवरलोडेड स्प्राइटबैच का उपयोग कर रहा हूं। बेगिन विधि, जो अन्य चीजों के साथ, एक मिश्रण राज्य है। मैं लगभग सकारात्मक हूँ कि मेरी समस्या है। मैं स्प्राइट्स को ब्लेंड नहीं करना चाहता, मैं चाहता हूं कि जब अल्फा 0. हो तो यह पारदर्शी हो। इस उदाहरण में मैं अल्फा को 0 पर सेट कर सकता हूं, लेकिन यह अभी भी दोनों टाइलों को प्रदान करता है, क्योंकि निचले z को स्प्राइट के माध्यम से दिखाने का आदेश दिया गया है, क्योंकि इसे बंद कर दिया गया है। सम्मिश्रण। यह एक वांछित प्रभाव नहीं है, मैं चाहता हूं कि उच्च जेड-ऑर्डर स्प्राइट को फीका कर दें और इस तरह से नीचे के रंग को प्रभावित न करें।

मैं यहाँ वैसे ही हो सकता हूँ क्योंकि मैं XNA के विकास में काफी नया हूँ इसलिए मुझे लगता है कि मैं गलत खरगोश के छेद से नीचे जा रहा हूँ।

TIA


यह 'उचित' अल्फा क्यों है? अल्फा समर्थन है, और अल्फा समर्थन नहीं है, है ना?
कम्युनिस्ट बतख

आपको 'एडिट' दबाकर शीर्षक को संपादित करने में सक्षम होना चाहिए और फिर शीर्षक शीर्ष पर होना चाहिए। जब तक कुछ बदला नहीं।
कम्युनिस्ट डक

जवाबों:


18

अगर मैं समस्या का सही ढंग से पालन करूं तो ब्लेंडस्टेट से शुरू करें। यह लेख 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 ट्रिक करने जा रहा है (कम से कम आपके द्वारा पोस्ट किए गए लिंक के अनुसार)। मैं प्रतीक्षा करने जा रहा हूं और यह देखूंगा कि क्या यह तब काम करता है जब मैं स्वीकार करने से पहले रात को घर आता हूं, लेकिन ऐसा लगता है कि यह उत्तर है। धन्यवाद!
सोशिमो

वह चाल थी। मुझे एहसास नहीं था कि वे 4.0 में बदल गए हैं। आपके द्वारा जोड़ा गया वह लेख बहुत ही रोचक था। धन्यवाद।
शशिमो

1
+1 धन्यवाद! मैं सिर्फ ऑनलाइन यह जानने की कोशिश कर रहा था कि अल्फा केवल आंशिक रूप से क्यों काम कर रहा है। इससे यह हल हो गया। मेरे द्वारा Google पर उपयोग किए जा रहे शब्द स्प्राइटबैच अपारदर्शिता थे, उम्मीद है कि वे शब्द अब इस जवाब को खोजने में गोगलर्स की मदद करेंगे।
AttackingHobo

6

एलेक्स की प्रतिक्रिया से पूरी तरह से सहमत हैं, हालांकि अगर आप प्रीप्लेप्लेटेड अल्फा के साथ चिपके रहते हैं तो मेरा मानना ​​है कि आप इसे इस तरह भी कर सकते हैं

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

Shawn ने premultiplied और non-multiplied Alpha - http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx के बीच अंतर बताने वाली एक पोस्ट भी की।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.