2014-10-30 8 views
5

मैं एक ऐसे अनुप्रयोग पर काम कर रहा हूं जो सरल 3 डी आकार खींचने के लिए शार्पडीएक्स और शार्पडीएक्स टूलकिट का उपयोग करता है, और जियोमेट्रिक्स। डिस्कोटॉप नमूना शुरू करने में बहुत मददगार था। अब मैं कुछ आकारों को पारदर्शी बनाने की कोशिश कर रहा हूं, और चीजों को सरल रखने के लिए मैं बस उस नमूने में टीपोट मॉडल को पारदर्शी दिखाई देने की कोशिश कर रहा हूं (शायद पारदर्शी अधिक सटीक होगा)।मैं SharpDX Toolkit के साथ एक पारदर्शी 3 डी ऑब्जेक्ट कैसे आकर्षित कर सकता हूं?

उन लोगों के लिए जो Geometrics.Desktop नमूना से परिचित नहीं हैं, यह 3 डी में कुछ सरल आदिम ज्यामितीय आकार खींचता है। एक नमूना ऐप होने के नाते, यह बहुत आसान है, इसलिए यह SharpDX "टूलकिट" लाइब्रेरी की 3 डी विशेषताओं के प्रयोग के लिए एक बहुत अच्छा स्क्रैचपैड बनाता है।

मैं सम्मिश्रण करने के लिए Direct3D तैयार करने के प्रयास में LoadContent विधि (जो स्टार्टअप समय एक ही बार में चलता है) को यह जोड़ दिया है,:

 var blendStateDescription = new BlendStateDescription(); 

     blendStateDescription.AlphaToCoverageEnable = false; 

     blendStateDescription.RenderTarget[0].IsBlendEnabled = true; 
     blendStateDescription.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha; 
     blendStateDescription.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha; 
     blendStateDescription.RenderTarget[0].BlendOperation = BlendOperation.Add; 
     blendStateDescription.RenderTarget[0].SourceAlphaBlend = BlendOption.Zero; 
     blendStateDescription.RenderTarget[0].DestinationAlphaBlend = BlendOption.Zero; 
     blendStateDescription.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add; 
     blendStateDescription.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All; 

     var blendState = SharpDX.Toolkit.Graphics.BlendState.New(this.GraphicsDevice, blendStateDescription); 
     this.GraphicsDevice.SetBlendState(blendState); 

मैं इस प्रकार गहराई स्टेंसिल की स्थापना की है:

 var depthDisabledStencilDesc = new DepthStencilStateDescription() 
     { 
      IsDepthEnabled = false, 
      DepthWriteMask = DepthWriteMask.All, 
      DepthComparison = Comparison.Less, 
      IsStencilEnabled = true, 
      StencilReadMask = 0xFF, 
      StencilWriteMask = 0xFF, 
      // Stencil operation if pixel front-facing. 
      FrontFace = new DepthStencilOperationDescription() 
      { 
       FailOperation = StencilOperation.Keep, 
       DepthFailOperation = StencilOperation.Increment, 
       PassOperation = StencilOperation.Keep, 
       Comparison = Comparison.Always 
      }, 
      // Stencil operation if pixel is back-facing. 
      BackFace = new DepthStencilOperationDescription() 
      { 
       FailOperation = StencilOperation.Keep, 
       DepthFailOperation = StencilOperation.Decrement, 
       PassOperation = StencilOperation.Keep, 
       Comparison = Comparison.Always 
      } 
     }; 

     // Create the depth stencil state. 
     var depthDisabledStencilState = SharpDX.Toolkit.Graphics.DepthStencilState.New(this.GraphicsDevice, depthDisabledStencilDesc); 
     //turn z-buffer off 
     this.GraphicsDevice.SetDepthStencilState(depthDisabledStencilState, 1); 

और ड्रा विधि में (जो फ्रेम दर पर चलती है और 3 डी मॉडल की एक छोटी सी सरणी के माध्यम से पुनरावृत्त करती है, प्रत्येक को चित्रित करती है), मैंने नीचे दिया गया कोड जोड़ा है। यह टीपोट को व्यूपोर्ट के केंद्र में ले जाता है और अन्य कुछ वस्तुओं को हल करने के लिए पर्याप्त बनाता है। चाय की केतली पिछले तैयार की है, इसलिए अन्य मॉडल पहले से ही प्रस्तुत किए गए हों, इसलिए मैं वास्तव में उम्मीद कर रही थी इस उनमें से शीर्ष पर एक पारदर्शी चाय की केतली आकर्षित होगा:

// Draw the primitive using BasicEffect 
if (i == 6) 
{ 
    basicEffect.Alpha = 0.5f; 
    basicEffect.World *= Matrix.Translation(-x, -y, 0); 
    basicEffect.World *= Matrix.Scaling(3); 
} 
else 
{ 
    basicEffect.Alpha = 1; 
} 

primitive.Draw(basicEffect); 

(टिप्पणी और अंतिम कॉल के थे हिस्सा ड्रा करने के लिए मूल नमूना कोड)

लेकिन अफसोस, परिणाम एक बड़ा अपारदर्शी अन्य वस्तुओं के बीच चाय की केतली है:।

enter image description here

क्या मुझे लगता है कि ते बनाने के लिए क्या करना होगा पारदर्शी पारदर्शी?

क्या मुझे कुछ याद आ रहा है, या क्या मैंने मिश्रण स्थिति को गलत तरीके से कॉन्फ़िगर किया है?

और केवल पूर्णता के लिए, मैंने 50% पर अल्फा चैनल वाले छवियों के साथ अपनी ऑब्जेक्ट्स को टेक्सचर करने का भी प्रयास किया है, लेकिन यह अभी भी अपारदर्शी वस्तुओं में परिणाम देता है।

किसी भी सहायता के लिए अग्रिम धन्यवाद!

+0

क्या आप direct3d11 का उपयोग कर रहे हैं? क्योंकि कोई * आदिम * बस * संदर्भ * नहीं है। –

+0

हां मैं डी 3 डी 11 का उपयोग कर रहा हूं, हालांकि मैं ज्यामितीय अर्थ - घन, गोलाकार, सिलेंडर आदि में "आदिम" शब्द का उपयोग कर रहा था। शार्पडीएक्स टूलकिट में कक्षाएं हैं जो इस तरह के आकार को आकर्षित करना आसान बनाती हैं, और इनके साथ काम करना आसान होता है। अधिकतर। उन्हें पारदर्शी बनाना बहुत कठिन रहा है। – NSFW

उत्तर

2

मेरे पास SourceAlphaBlend और DestinationAlphaBlend शून्य पर सेट है और यह काम करता है जैसा कि यह करना चाहिए। उन राज्यों के अलावा राज्य का विवरण मेरे लिए सही दिखता है। साथ ही, सुनिश्चित करें कि अल्फाटेकॉवरेज मिश्रणस्टेट में अक्षम है या अन्यथा आपके पास अजीब अभिनय करने वाली अन्य चीजें होंगी।

यह भी सुनिश्चित करें कि आप प्रत्येक फ्रेम को आकर्षित करने से पहले ब्लेंडस्टेट सेट करें।

+0

क्या आप वाकई एकमात्र बदलाव कर रहे हैं? मैंने अभी उन परिवर्तनों को मेरे टेस्ट ऐप में बनाया है और टीपोट अभी भी अपारदर्शी है। कि आपके पास अल्फा काम कर रहा है, मुझे बहुत उम्मीद है, यद्यपि! – NSFW

+1

क्या आप विजुअल स्टूडियो का उपयोग कर रहे हैं?यदि ऐसा है, तो D3D11 डिवाइस और रनटाइम पर राज्यों को डीबग करने के लिए "डीबग-> ग्राफिक्स-> प्रारंभ डायग्नोस्टिक्स" टूल का उपयोग करें। शायद एक राज्य सही ढंग से बंधे नहीं जा रहा है। –

+0

मेरे पास एक पारदर्शी टीपोट है! डायग्नोस्टिक टूल में दिखाई देने वाला मिश्रणस्टैट उतना ही नहीं है जितना मैंने कोड में कॉन्फ़िगर किया था। मैंने इसे रेंडर लूप और पारदर्शिता कार्यों में स्थानांतरित कर दिया। मैं इसे रेंडर लूप से बाहर ले जाना चाहता हूं, लेकिन मैं इसे अगले में देख लूंगा। – NSFW

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