2008-10-09 17 views
12

डिफ़ॉल्ट रूप से ऐसा लगता है कि वस्तुओं को पीछे से खींचा जाता है। मैं एक 2-डी यूआई ऑब्जेक्ट खींच रहा हूं और इसे वापस सामने बनाना चाहता हूं। उदाहरण के लिए, मैं पहले एक सफेद वर्ग बना सकता था, फिर उसके ऊपर थोड़ा सा काला वर्ग बना सकता था जिससे एक सफेद सीमा के साथ एक काला फलक बना। This post पर इस पर कुछ चर्चा हुई और इस आदेश को "पेंटर के एल्गोरिदम" के रूप में वर्णित किया गया लेकिन आखिरकार उन्होंने उदाहरण दिया कि वांछित प्रभाव प्राप्त करने के लिए उन्होंने ऑब्जेक्ट को रिवर्स ऑर्डर में आसानी से प्रस्तुत किया। मैं सामने आ गया हूं (पहली वस्तुएं वापस आती हैं, बाद की वस्तुओं को शीर्ष पर खींचा जाता है) प्रतिपादन कुछ परिवर्तन (gortho?) के माध्यम से हासिल किया जा सकता है?ओपनजीएल में, आप आइटम को सामने खींचने के लिए कैसे प्राप्त कर सकते हैं?

मैं यह भी उल्लेख करूंगा कि मुझे ग्लूट जैसे रैपर लाइब्रेरी का उपयोग करके समाधान में रूचि नहीं है।

मुझे यह भी पता चला है कि कोको NSOpenGLView का उपयोग कर मैक पर डिफ़ॉल्ट व्यवहार सामने आता है, जहां विंडोज़ में मुझे यह व्यवहार नहीं मिल सकता है। खिड़कियों मैं उपयोग कर रहा हूँ में सेटअप कोड यह है:

glViewport (0, 0, wd, ht); 
glMatrixMode(GL_PROJECTION);   
glLoadIdentity();      
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f); 
glMatrixMode(GL_MODELVIEW);    
glLoadIdentity();      

उत्तर

20

निम्न कॉल गहराई से परीक्षण बंद कर देगा जिससे वस्तुओं को बनाए गए क्रम में खींचा जा सकेगा।इससे प्रभाव वस्तुएं सामने आ जाएंगी।

glDepthFunc(GL_NEVER);  // Ignore depth values (Z) to cause drawing bottom to top 

यकीन है कि आप इस फोन तो नहीं रखा AlanKley

glEnable (GL_DEPTH_TEST); // Enables Depth Testing 
+1

बिल्कुल मुझे क्या चाहिए। मेरे मामले में gldisable (GL_DEPTH_TEST) के लिए एक साधारण कॉल; चाल है :) +1 – absentmindeduk

2

ड्राइंग आदेश कठिन है। कोई आसान समाधान नहीं है। चित्रकार के एल्गोरिदम (आपके कैमरे के दृश्य के संबंध में उनकी दूरी से वस्तुओं को क्रमबद्ध करें) सबसे सरल है, लेकिन जैसा कि आपने पाया है, यह सभी मामलों को हल नहीं करता है।

मैं चित्रकार के एल्ग्राइथम और परतों के संयोजन का सुझाव दूंगा। आप अपने कार्यक्रम पर विशिष्ट तत्वों के लिए परतें बनाते हैं। तो आपको पृष्ठभूमि परत, ऑब्जेक्ट परतें, विशेष प्रभाव परतें, और जीयूआई परत मिल गई है।

प्रत्येक परत की वस्तुओं पर चित्रकार के एल्गोरिदम का उपयोग करें। कुछ विशेष परतों (जैसे आपकी जीयूआई परत) में, चित्रकार के एल्गोरिदम के साथ सॉर्ट न करें, लेकिन आपके कॉल ऑर्डर द्वारा। आप पहले उस सफेद वर्ग को बुलाते हैं ताकि इसे पहले खींचा जा सके।

+0

अच्छा विचार है, लेकिन सभी कि अतिरिक्त काम की आवश्यकता है। जैसा कि मैंने उल्लेख किया है, मैक पर, अगर मुझे गलत नहीं लगता है, ऐसा लगता है कि मैं ऐसा करना चाहता हूं। NSOpenGLView के लिए डिफ़ॉल्ट सेटअप बिना किसी विशेष हैंडलिंग – AlanKley

2

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

+0

अच्छा विचार के बिना फ्रंट ऑर्डरिंग की अनुमति देता है। मुझे लगता है कि ऐसा करने के लिए कोई "स्वचालित" तरीका नहीं है, हालांकि। – AlanKley

+1

या, यदि आप वास्तव में 2 डी दुनिया में रहना चाहते हैं, तो आप एक ऑर्थोग्राफिक प्रक्षेपण का उपयोग कर सकते हैं। फिर जेड वैल्यू (फिर, मान लीजिए कि ज़ेड स्क्रीन प्लेन के लिए लंबवत है) इससे कोई फर्क नहीं पड़ता कि यह निर्धारित करने के अलावा कि कौन सी ऑब्जेक्ट्स हैं! –

5

आपके विशिष्ट प्रश्न के लिए, ओपनजीएल में गहराई से ऑर्डर करने के लिए कोई मानक तरीका नहीं है। कुछ कार्यान्वयन डिफ़ॉल्ट रूप से गहराई से गहराई से ऑर्डर कर सकते हैं क्योंकि यह आमतौर पर तेज़ होता है, लेकिन इसकी गारंटी नहीं है (जैसा आपने पाया)।

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

ट्यूटोरियल जिसे आपने केवल इसके बारे में बात करने के लिए एक लिंक पोस्ट किया है क्योंकि गहराई सॉर्टिंग प्रासंगिक है जब आप पारदर्शिता का उपयोग कर रहे हैं। लेकिन यह मेरे जैसा नहीं लगता है कि आप इसके बाद क्या कर रहे हैं।

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

+0

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

+0

मेरा मानना ​​है कि मुझे आगे की ड्राइंग पर वापस सक्षम करने के लिए जीएल दुनिया स्थापित करने का एक तरीका मिला। नीचे दिए गए मेरे दिए गए उत्तर देखें। मैं इस जवाब को अस्वीकार कर रहा हूं। – AlanKley

+0

आपका समाधान वह नहीं है जो आपने अपने प्रश्न में पूछा था। बेशक गहराई बफर को अक्षम करने से आप उन्हें आपूर्ति करने के क्रम में आकर्षित करेंगे, यह एक ध्वज नहीं है जो उन्हें तब तक आगे खींचता है जब तक कि आप उन्हें अपने सामने वापस खींचें। – Gerald

0

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

मैंने हमेशा चित्रकार के एल्गोरिदम को छुपे हुए सतह हटाने के लिए वैकल्पिक तकनीक के रूप में सोचा है जब आप ज़ेड-बफर का उपयोग नहीं कर सकते (या नहीं करना चाहते)।

+0

अनुमोदित, मेरा उदाहरण बहुत विशिष्ट है और 3 डी दुनिया को संबोधित नहीं करता है। मैं एक संदेश बॉक्स त्रुटि रिपोर्टिंग फलक को लागू करने की कोशिश कर रहा हूं और यह हमेशा फ्लैट – AlanKley

1

आपका सामान सटीक क्रम आप में glBegin/glEnd कार्यों फोन में तैयार किया जाएगा। आप गहराई-बफरिंग z-बफर का उपयोग कर प्राप्त कर सकते हैं, और यदि आपके 2d वस्तुओं अलग z मान है, तो आप प्रभाव आप प्राप्त कर सकते हैं उस तरह से चाहते हैं। मैक पर आपके द्वारा वर्णित व्यवहार को देखने का एकमात्र तरीका यह है कि यदि प्रोग्राम मैन्युअल रूप से बैक-टू-फ्रंट ऑर्डर में सामान खींच रहा है या इसे पूरा करने के लिए जेड-बफर का उपयोग कर रहा है। ओपनजीएल अन्यथा आपके द्वारा वर्णन किए जाने पर स्वचालित रूप से कोई कार्यक्षमता नहीं है।

+0

2 वर्ग पूर्व प्रदर्शित करेगा। मैंने वर्णन किया कि WAS glBegin/glEnd के बीच खींचा जा रहा है। मैंने पहले सफेद वर्ग को खींचा और काला वर्ग दूसरा और मैंने देखा सब एक सफेद वर्ग था। सवाल पूछने का मेरा लक्ष्य जेड निर्देशांक का उपयोग किये बिना 2-डी दुनिया का अनुकरण करना है। मैक पर मुझे सफेद सीमा के साथ एक काला वर्ग दिखाई देता है। – AlanKley

+1

आपके पास ज़ेड-बफरिंग होना चाहिए था और दो वर्गों को चित्रित करना था जिनके समान z-value था। मुझे लगता है कि दो प्रणालियों और गोलियों की त्रुटियों के बीच ग्राफिक्स हार्डवेयर के आधार पर, दूसरा वर्ग दूसरे के माध्यम से "पोक" कर सकता है। बस जेड-बफरिंग बंद करें और वांछित क्रम में वर्ग खींचें। –

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