2010-04-17 6 views
8

जो मैं करने की कोशिश कर रहा हूं वह एक बनावट बनावट पारदर्शी हिस्से का हिस्सा बनाने के लिए एक्सएनए में अल्फा मिश्रण का उपयोग करना है। तो उदाहरण के लिए, मैं स्क्रीन को कुछ रंगों में साफ़ करता हूं, ब्लू कहता हूं। फिर मैं एक बनावट खींचता हूं जो लाल है। अंततः मैं एक बनावट खींचता हूं जो केंद्र में पूरी तरह से पारदर्शी से किनारे पर पूरी तरह से काला होने के लिए सिर्फ एक रेडियल ढाल है। मैं चाहता हूं कि लाल बनावट रेडियल ग्रेडियेंट बनावट के समान स्थानों में पहले पारदर्शी हो। तो आप लाल बनावट के माध्यम से नीली पीठ के मैदान को देखने में सक्षम होना चाहिए।एक्सएनए अल्फा मिश्रण एक बनावट का हिस्सा बनाने के लिए पारदर्शी

मैंने सोचा कि यह काम करेगा।

GraphicsDevice.Clear(Color.CornflowerBlue); 

spriteBatch.Begin(SpriteBlendMode.None); 
spriteBatch.Draw(bg, new Vector2(0, 0), Color.White); 
spriteBatch.End(); 

spriteBatch.Begin(SpriteBlendMode.None); 

GraphicsDevice.RenderState.AlphaBlendEnable = true; 
GraphicsDevice.RenderState.AlphaSourceBlend = Blend.One; 
GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.Zero; 
GraphicsDevice.RenderState.SourceBlend = Blend.Zero; 
GraphicsDevice.RenderState.DestinationBlend = Blend.One; 
GraphicsDevice.RenderState.BlendFunction = BlendFunction.Add; 

spriteBatch.Draw(circle, new Vector2(0, 0), Color.White); 
spriteBatch.End(); 

GraphicsDevice.RenderState.AlphaBlendEnable = false; 

लेकिन यह मेरी सभी रेंडरस्टेट सेटिंग्स को अनदेखा करता है। मैंने स्प्राइटब्लेंड मोड को अल्फाब्लेंड में सेट करने का भी प्रयास किया। यह बनावट को मिलाता है, लेकिन यह वह प्रभाव नहीं है जिसे मैं चाहता हूं।

किसी भी मदद की सराहना की जाएगी।

उत्तर

6

आप अल्फा चैनल मास्किंग करने का प्रयास कर रहे हैं। सबसे आसान तरीका सामग्री पाइपलाइन का उपयोग करके अल्फा चैनल को सेंकना है। लेकिन अगर किसी कारण से आप क्रम में करना चाहते हैं यहाँ कैसे (मोटे तौर पर) लक्ष्य प्रस्तुत करना का उपयोग कर (ए बेहतर और तेज समाधान एक शेडर लिखने के लिए होगा)

पहले स्टोर करने के लिए एक RenderTarget2D और मध्यवर्ती नकाबपोश बनावट बनाने

RenderTarget2D maskRenderTarget = GfxComponent.CreateRenderTarget(GraphicsDevice, 
    1, SurfaceFormat.Single); 

renderTarget, और डिवाइस स्थिति सेट

GraphicsDevice.SetRenderTarget(0, maskRenderTarget); 
GraphicsDevice.RenderState.AlphaBlendEnable = true; 
GraphicsDevice.RenderState.DestinationBlend = Blend.Zero; 
GraphicsDevice.RenderState.SourceBlend = Blend.One; 

चैनलों आर, जी, बी चैनलों के लिए लिख सकते हैं और स्प्राइट बैच

का उपयोग कर पहली बनावट आकर्षित करने के लिए सेट करें केवल
GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.Red | ColorWriteChannels.Green | ColorWriteChannels.Blue; 
spriteBatch.Draw(bg, new Vector2(0, 0), Color.White); 

सेट अल्फा के चैनल, और आकर्षित अल्फा मुखौटा

GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.Alpha; 
spriteBatch.Draw(circle, new Vector2(0, 0), Color.White); 

आप अब वापस बफर करने के लिए लक्ष्य प्रस्तुत करना बहाल करने और अल्फा सम्मिश्रण का उपयोग कर अपने बनावट आकर्षित कर सकते हैं।

maskedTexture = shadowRenderTarget.GetTexture(); 
... 

इसके अलावा राज्य को बहाल करने की भूल नहीं है:

GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.All; 
... 
+0

जवाब के लिए धन्यवाद और इस बेहद करीब है, लेकिन उनके एक समस्या है। सर्कल बनावट पृष्ठभूमि बनावट से छोटी है, और उपर्युक्त कोड के साथ क्या हो रहा है, बैक ग्राउंड केवल तभी खींचा जाता है जहां सर्कल बनावट मौजूद होती है। विचार सर्कल बनावट को आकर्षित करना है जहां माउस पॉइंटर है और उपयोगकर्ता बैक ग्राउंड के माध्यम से देख सकता है जहां सर्कल बनावट है। – DangerMouse

+0

@ डेविड, यदि आपको अल्फा मास्क को उलटा करने की आवश्यकता है तो अल्फा चैनल को सफेद का उपयोग करके साफ़ करें और काले रंग का उपयोग करके सर्कल खींचें। –

+0

यह धन्यवाद काम किया। मुझे ग्राफिक्सडिवाइस.रेंडरस्टेट.डिस्टिनेशन ब्लेंड = ब्लेंड.जेरो; ग्राफिक्सडिवाइस। रेंडरस्टेट। सोर्सब्लेंड = ब्लेंड.ऑन; हालांकि इसे काम करने के लिए मंडलियों को आकर्षित करने से ठीक पहले। मैंने सोचा कि यह डिफ़ॉल्ट मान था, लेकिन जब तक मैं उन्हें सेट नहीं करता तब तक यह काम नहीं करता था। सभी मदद के लिए धन्यवाद। – DangerMouse

संबंधित मुद्दे