2012-09-12 15 views
5

मैंने स्क्रीन पर कई अलग-अलग रंगीन बहुभुज खींचे हैं, अब मुझे अलग-अलग रंगों का एक और बहुभुज खींचना है, लेकिन यह बहुभुज केवल उन पिक्सेल पर खींचा जाना चाहिए जिनके पास एक विशिष्ट रंग है।केवल विशिष्ट पिक्सेल रंगों पर बहुभुज कैसे आकर्षित करें?

मैं अपने स्वयं के "परतों" में एक ही समय में प्रत्येक रंगीन बहुभुज को प्रस्तुत करता हूं, (= एक समय में एक रंग)। वे एक दूसरे को कवर कर सकते हैं; नवीनतम परत सभी पिछली परतों को कवर करती है। छवि में काला रंग "कोई बहुभुज" क्षेत्र नहीं है: खाली स्थान, और इसे भी अनदेखा करना चाहिए।

तो, मूल रूप से मैं केवल बहुभुज प्रस्तुत करता हूं, और फिर बहुभुज की पहली (पहली नहीं) परत को अगले बहुभुज परत के साथ मुखौटा किया जाना चाहिए, और इसके तहत कुछ भी प्रभावित नहीं होना चाहिए। विधि की

छवि की जरूरत:

enter image description here

क्या विधि मैं ओपन के साथ इस लक्ष्य को हासिल करने के लिए उपयोग कर सकते हैं? यदि संभव हो तो मैं इसके लिए गैर-शेडर समाधान पसंद करूंगा (?)।

एकमात्र तरीका जो मैं वर्तमान में कर सकता हूं, प्रत्येक परत को स्मृति में अलग से प्रस्तुत करना है, फिर पिक्सल के माध्यम से स्वयं को ले जाएं और परतों को "मैन्युअल रूप से" गठबंधन करें, लेकिन यह एक बहुत धीमी विधि की तरह लगता है, हालांकि करने योग्य है, लेकिन गति यहां महत्वपूर्ण है।

उत्तर

4

इस के लिए स्टेंसिल बफर का उपयोग करने के लिए, आप क्या कर सकते है:

सुनिश्चित करें कि आप एक संदर्भ एक स्टेंसिल बफर है कि अनुरोध करते हैं, इस प्रणाली के विशिष्ट इसलिए मैं इसे यहाँ कवर नहीं किया जाएगा विंडोइंग किया गया है। यह सुनिश्चित करने के लिए कि आपको पर्याप्त संख्या में बिट्स मिलें, glGet(GL_STENCIL_BITS) पर कॉल करें।

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

//draw layer N 
glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_ALWAYS, N, -1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

अब के साथ ऐसा कर के रूप में आप प्रत्येक परत आकर्षित, पिछले बहुभुज है कि स्क्रीन के लिए तैयार किया गया था भी स्टेंसिल बफर में यह परत संख्या संग्रहीत करता है।

इस बिंदु जब आप वापस जाएँ और अपनी हरी स्टार आकर्षित करने के लिए चाहते हैं, आप बस इसे जहां स्टेंसिल बफर एन

//draw only where stencil == N 
glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_EQUAL, N, -1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
drawStar(); 
+0

के बराबर है तुम क्यों 'GL_STENCIL_TEST' सक्षम कर सकता हूँ बता केवल पिक्सल पर आकर्षित करने के लिए केवल दूसरे कोड पर? क्या मैं इसे पहले कोड पर भी सक्षम नहीं कर सकता? – Rookie

+0

आप सही हो सकते हैं। मैंने मूल रूप से सोचा था कि STENCIL_TEST को केवल तब सक्षम होना था जब आप वास्तव में स्टैंसिल बफर के आधार पर कुछ अस्वीकार करना चाहते थे, न केवल इसे अपडेट करने के लिए। हालांकि glStencilOp कोड को फिर से पढ़ने से ऐसा लगता है कि परीक्षण अक्षम होने पर स्टैंसिल बफर को संशोधित नहीं किया जा सकता है। आपको पहले भाग के लिए स्टैंसिल परीक्षण को सक्षम करने में सक्षम होना चाहिए, इस पर विचार करना कि स्टैंसिल func हमेशा पास होने के लिए सेट है। @Rookie – Tim

+0

इसका परीक्षण किया, खूबसूरती से काम करता है! और मैंने यह भी परीक्षण किया कि यह वास्तव में दोनों मामलों के लिए सक्षम होना चाहिए। – Rookie

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