2013-01-04 46 views
6

मैं आईओएस पर एक हस्तलेखन आवेदन पर काम कर रहा हूं। मुझे आईओएस दस्तावेज से नमूना प्रोजेक्ट "जीएलपीेंट" मिला जो ओपनजीएल ईएस द्वारा कार्यान्वित किया गया है, और मैंने इसमें कुछ संशोधन किया है।OpenGL का उपयोग करके पारदर्शिता ओवरलैप से कैसे बचें?

मैं टच पॉइंट ट्रैक करता हूं और अंक के बीच घटता की गणना करता हूं और कण छवियों को अकेले वक्र खींचता हूं ताकि यह उंगली पासबी कहां दिख सके।

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, brushData); // burshData is from CGImage, it is 

// vertexBuffer is generated based on the calculated points, it's just a sequence of point where need to draw image. 
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 
glDrawArrays(GL_POINTS, 0, vertexCount); 

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER_OES]; 

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

Result of 50% transparency particle image

Result of 50% transparency particle image

वहाँ कुछ मिश्रण के साथ गलत है।

What I need

What I need

मैं अर्द्ध पारदर्शिता कण छवि का उपयोग कर तीन अंक हैं और आपको चौराहे क्षेत्र 50% पारदर्शिता रखना चाहिए।

समाधान क्या है?

+1

समस्या यह है कि आपको ओवरड्रा को खत्म करने की आवश्यकता है, जिसके लिए सामान्य केस_ "केवल मिश्रण" के साथ संभव नहीं है। आप गहराई बफर (अल्फा परीक्षण के साथ) का उपयोग कर सकते हैं लेकिन यह ठीक से एंटीअलाइज़ नहीं होगा। यदि आप इसे उचित रूप से एंटीअलाइज्ड होना चाहते हैं, तो कम से कम सामान्य मामले में, सही होने के लिए यह छोटा नहीं है। आपको पहले एक अतिरिक्त फ्रेमबफर को प्रस्तुत करना होगा, और दूसरे पास में समग्र होना होगा। – Damon

+0

आपके उत्तर के लिए धन्यवाद। मैं ओपनजीएल के लिए नौसिखिया हूं, मैं अभी भी ओपनजीएल में सबसे ज्यादा धारणाओं के बारे में स्पष्ट नहीं हूं। मुझे लगता है कि एंटीअलियास समस्या नहीं है। क्या आप कृपया अधिक जानकारी के साथ कोड बता सकते हैं? –

उत्तर

0

आपको मिश्रण फ़ंक्शन को बदलना होगा। आप के साथ चारों ओर खेल सकते हैं:

glBlendFunc(GL_SRC_ALPHA,GL_ONE); 

शायद (GL_ONE, GL_ONE), भूल गया अपने मामले को संभालने के लिए कैसे, लेकिन समाधान है कि समारोह में है।

http://www.opengl.org/sdk/docs/man/xhtml/glBlendFunc.xml

6

इम शायद दो साल बाद उस सवाल का जवाब है, लेकिन मैं इसे किसी को जो यहाँ इस समस्या का समाधान की तलाश में, जैसे कि यह मुझे क्या हुआ आता है में मदद करता है उम्मीद है।

आपको प्रत्येक सर्कल को एक अलग जेड मान को असाइन करने की आवश्यकता होगी। इससे कोई फर्क नहीं पड़ता कि यह अंतर कितना बड़ा या छोटा है, हमें केवल उन्हें सख्ती से बराबर होने की आवश्यकता नहीं है।

सबसे पहले, आप रंग बफर glColorMask(false,false,false,false) में लेखन अक्षम करते हैं, और फिर सामान्य रूप से मंडलियों को आकर्षित करते हैं। ज़ेड-बफर वांछित के रूप में अपडेट किया जाएगा, लेकिन अभी तक कोई भी मंडल नहीं खींचा जाएगा।

फिर, आप रंग बफर (glColorMask(true,true,true,true)) में लेखन सक्षम करते हैं और गहराई FUNC को LEQUAL (glDepthFunc(GL_LEQUAL)) पर सेट करते हैं। केवल निकटतम सर्कल पिक्सल गहराई परीक्षण पास करेंगे (इसे कुछ दुर्लभ लेकिन संभावित फ़्लोटिंग पॉइंट सन्निकटन त्रुटियों के साथ इक्वाल सौदों के बजाय LEQUAL पर सेट करना होगा)। मिश्रण को सक्षम करने और उन्हें फिर से खींचना आपके द्वारा इच्छित छवि का उत्पादन करेगा, बिना पारदर्शिता ओवरलैप के।

+0

वास्तव में आपके उत्तर के लिए धन्यवाद। एक और प्रश्न। "अलग-अलग z मान असाइन करके" आपका क्या मतलब है। क्या यह समन्वय या जेड-बफर मूल्य का तीसरा आयाम है? क्षमा करें अगर यह सवाल थोड़ा समझ में आता है, तो मैं opengl के लिए नौसिखिया हूँ। –

+0

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

+0

आप भ्रमित हो सकते हैं क्योंकि अधिकांश बार हम परिवर्तन मैट्रिक्स का उपयोग कर वर्टेक्स शेडर के अंदर एक समन्वय परिवर्तन लागू करते हैं। तो, आपके पास एक कशेरुक के लिए प्रारंभिक एक्स, वाई, जेड है और यह कैमरे या जो भी हो, उसे संरेखित करने के लिए दूसरी स्थिति में बदल जाता है, इसलिए शेडर द्वारा उपयोग किया जाने वाला वास्तविक ज़ेड आपके चरम का मूल ज़ेड नहीं हो सकता है। यह स्पष्ट करने के लिए थोड़ा जटिल है कि क्या आप ओपनजीएल के लिए नए हैं, इसलिए मैं आपको इस ट्यूटोरियल को पढ़ने के लिए दृढ़ता से अनुशंसा करता हूं ("गहराई और स्टैंसिल" भाग तक), https://open.gl/, जब मैंने शुरू किया था तो इससे मुझे काफी मदद मिली। यदि आपको आवश्यकता हो तो मुझसे और पूछने में संकोच न करें! – Ivelate