2010-11-25 17 views
9

मेरे पास एक चलती 3 डी दृश्य सेट है, और मैं एक स्थिर 2 डी जीयूआई ओवरले बनाना चाहता हूं जो हमेशा शीर्ष पर होता है, जब मैं 2 डी आकार बनाने की कोशिश करता हूं तो मुझे कुछ भी दिखाई नहीं देता । जब मैं कॉल करता हूं: glMatrixMode (GL_PROJECTION); मेरी 3 डी दृश्य गायब हो जाता है और मैं एक खाली खिड़की के साथ छोड़ दिया हूँ ...ओपनग्ल 3 डी दृश्य समस्या पर 2 डी ओवरले ड्राइंग

यहाँ कोड मैं ओवरले के लिए उपयोग कर रहा हूँ है

संपादित करें: अद्यतन कोड

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(-100, 100, -100, 100); 
glDisable(GL_DEPTH_TEST); 
glDisable(GL_CULL_FACE); 
glDisable(GL_TEXTURE_2D); 
glDisable(GL_LIGHTING); 
glColor3f(1, 1, 1); 
glPushMatrix(); 
glBegin(GL_QUADS); 
glVertex3f(-5.0f, 5.0f, 0.0f); 
glVertex3f(-5.0f, -5.0f, 0.0f); 
glVertex3f(5.0f, -5.0f, 0.0f); 
glVertex3f(5.0f, 5.0f, 0.0f); 
glEnd(); 
glPopMatrix(); 
glEnable(GL_DEPTH_TEST); 
glutSwapBuffers(); 

उत्तर

4

आप आरेखित करना होगा अपने दूसरे क्रम में चौकोर। डिफ़ॉल्ट रूप से, ओपनजीएल काउंटरक्लॉक वार फ्रंट बहुभुज का उपयोग करता है। इसका मतलब है कि आप अपने बहुभुज को नहीं देखते हैं क्योंकि आप केवल उसका पिछला चेहरा देखते हैं।

आप glFrontFace पर एक नज़र डाल सकते हैं।

संपादित करें:

इसके अलावा, यह है कि अगर काम नहीं करता है, तो आपको निम्न राज्यों को निष्क्रिय करने की कोशिश कर सकते:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(-100, 100, -100, 100); 
glDisable(GL_DEPTH_TEST); 
glDisable(GL_CULL_FACE); 
glDisable(GL_BLENDING); 
glDisable(GL_TEXTURE_2D); 
glDisable(GL_LIGHTING); 

आप नहीं गड़बड़ अपने राज्य के लिए उपयोग glPushAttrib और glPopAttrib चाहते हो सकता है।

+1

या 'glDisable (GL_CULL_FACE)'। – JWWalker

+0

ने एक ही समस्या होने तक glVertex3f के क्रम को बदल दिया, मुझे लगता है कि यह कुछ और है। – ajoe

+1

glMatrixMode (GL_PROJECTION) सेट करने के बाद इसे वापस glMatrixMode (GL_MODELVIEW) पर सेट करें, और विशेष रूप से आपके 2 डी UI कोड समाप्त होने के बाद। – ext

1

इसके अतिरिक्त, मैं इस तरह की चीजों के लिए एक अलग एफबीओ भी उपयोग करता हूं। आम तौर पर ओवरले को हर बार फिर से खींचा जाना नहीं पड़ता है, इसलिए इसे एफबीओ की मांग पर प्रस्तुत करें और इसे प्रत्येक फ्रेम के पूर्णस्क्रीन क्वाड के रूप में प्रस्तुत करें। यह कुछ fillrate बर्बाद करता है लेकिन आम तौर पर मुझे लगता है कि यह आमतौर पर तेजी से तेज है और कोड इतना साफ करता है।

+0

मज़ेदार लगता है, लेकिन डिफ़ॉल्ट एफबीओ जरूरतों के बजाय आपके विशिष्ट एफबीओ को प्रस्तुत करना, ठीक है, बिल्कुल वही प्रतिपादन कोड :) और कुछ भी एफबीओ को संभालने के लिए। यहां लाभ कहां है? – Kos

+0

आईएमओ: गति, क्लीनर कोड, आसान डीबगिंग। यह उसकी समस्या का समाधान नहीं करता है, और हाँ वही प्रतिपादन कोड की आवश्यकता है। लेकिन यह दो अलग चरणों में विभाजित है। और जैसा कि आपने अपने उत्तर में कहा था, उसे शेडर्स का उपयोग करना चाहिए, और एफबीओ को जोड़ना और शेडर्स आपको स्क्रीनसाइज्ड क्वाड को प्रस्तुत करते समय प्रभावों को और अधिक मज़ेदार बनाने की अनुमति देता है। – ext

4

हम्म ... आपके द्वारा पोस्ट किए गए कोड के टुकड़े पर निर्भर करते हुए, मेरा मानना ​​है कि आपका दृश्य गायब हो जाता है क्योंकि आप अपने मैट्रिक्स के साथ क्या कर रहे हैं - मेरे लिए थोड़ा अराजक दिखता है। दृष्टिकोण इस तरह दिखना चाहिए:

  • साफ स्क्रीन
  • 3 डी:
    • प्रकाश, z-परीक्षण, आदि
    • प्रक्षेपण के लिए
    • सेट सक्रिय मैट्रिक्स मोड लोड पहचान सक्षम है और एक की स्थापना परिप्रेक्ष्य प्रक्षेपण
    • सक्रिय मैट्रिक्स मोड को वापस मॉडलव्यू
    • सब कुछ खींचें 3 डी
  • 2 डी:
    • अक्षम प्रकाश, z-परीक्षण, आदि
    • सेट सक्रिय मैट्रिक्स मोड प्रक्षेपण के लिए
    • लोड पहचान और एक ortogonal प्रक्षेपण
    • सेट सक्रिय मैट्रिक्स मोड स्थापित वापस
    • modelview को
    • सबकुछ खींचें 2 डी
  • स्वैप बफर

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

1

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

के पास विमान 0.01f है, तो अपने शिखर परिभाषाओं

glVertex3f(-5.0f, 5.0f, -0.02f); 
glVertex3f(-5.0f, -5.0f, -0.02f); 
glVertex3f(5.0f, -5.0f, -0.02f); 
glVertex3f(5.0f, 5.0f, -0.02f); 

मैं MatrixMode(GL_MODELVIEW) आप हमेशा -Z एक्सिस जांच कर रहे हैं में विश्वास करते हैं हो सकता है। मुझे उम्मीद है कि यह मदद करता है।

मैं गलत हो सकता हूं लेकिन मुझे लगता है कि DEPTH_TEST आपके अंतिम प्रस्तुत ऑब्जेक्ट के जेड-बफरिंग को संदर्भित करता है, मुझे नहीं लगता कि यह निकट-हवाई मूल्य को अक्षम करता है।

2
glDisable(GL_DEPTH_TEST); 
glDisable(GL_CULL_FACE); 
glDisable(GL_TEXTURE_2D); 
glDisable(GL_LIGHTING); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(-100, 100, -100, 100); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glColor3f(1, 1, 1); 
glBegin(GL_QUADS); 
    glVertex3f(20.0f, 20.0f, 0.0f); 
    glVertex3f(20.0f, -20.0f, 0.0f); 
    glVertex3f(-20.0f, -20.0f, 0.0f); 
    glVertex3f(-20.0f, 20.0f, 0.0f); 
glEnd(); 
/// Now swap buffers 
0
' glGetBooleanv(GL_BLEND,  &m_origin_blend); 
glGetBooleanv(GL_DEPTH_TEST,&m_origin_depth); 
glGetBooleanv(GL_CULL_FACE, &m_origin_cull); 

setAlphaBlending(true); 
setDepthTest(false); 
setCullFace(false); //by stone 

//ur draw core() 

setAlphaBlending(m_origin_blend>0?true:false); 
setDepthTest(m_origin_depth>0?true:false); 
setCullFace(m_origin_cull>0?true:false); //by stone 
' 
संबंधित मुद्दे