OpenGL (LWJGL) के साथ एक HUD / GUI बनाना


15

मैं अपने खेल के विकास के चरण में हूं जहां मुझे HUD या GUI बनाने की आवश्यकता है। मैंने कभी इस हिस्से को प्राप्त नहीं किया है, इसलिए मुझे नहीं पता कि इसका काम कैसे हुआ। मैंने स्क्रीन पर एक निश्चित स्थान पर एक साधारण क्वाड को प्रस्तुत करने की कोशिश की, लेकिन एक समस्या है। अपने कैमरे को ऑर्थोग्राफिक के साथ काम करने के लिए, मैं इसका उपयोग करता हूं:

public void lookThrough()
{
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(position.x, position.x + Display.getDisplayMode().getWidth()/zoom, position.y + Display.getDisplayMode().getHeight()/zoom, position.y, -1, 1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
}

मैं यह नहीं देखता कि मैं इस पद्धति का उपयोग करके स्क्रीन पर कुछ कैसे तय कर पाऊंगा? इसके आसपास कोई रास्ता? धन्यवाद :)


मैं जवाब नहीं दूंगा क्योंकि यह एक Direct3D परिप्रेक्ष्य से है, लेकिन यदि आप ([0...1], [0...1], 0, 1)NO प्रक्षेपण, दृश्य या विश्व मैट्रिक्स के साथ निर्देशांक का उपयोग करते हैं , तो वे हमेशा स्क्रीन स्पेस में उतरेंगे।
जोनाथन डिकिंसन

जवाबों:


13

यह एक पुराने OpenGL- आधारित गेम इंजन से है जिसे मैं लगभग सात साल पहले C ++ में लिखा गया था, इसलिए मेरे साथ नंगे होकर यह समझाने की कोशिश की कि मैंने 3D वर्ल्ड और 2D GUI रेंडरिंग ऑपरेशन को कैसे संभाला। मैंने अपने OpenGL रेंडरर वर्ग (OGLRender) के भीतर चार प्राथमिक विधियों का उपयोग किया है:

  • 3 डी दुनिया दृश्य प्रस्तुत करने के लिए OpenGL तैयार करने के लिए तैयार 3 डी ()
  • तैयार 2 डी () 2 डी जीयूआई को प्रस्तुत करने के लिए ओपनजीएल तैयार करने के लिए।
  • वास्तविक 3 डी विश्व दृश्य ड्राइंग के लिए रेंडर 3 डी ()
  • वास्तविक 2 जीयूआई ड्राइंग के लिए रेंडर 2 डी ()

    void OGLRender::ready3D()
    {
        glViewport(0, 0, m_Setup.width, m_Setup.height);
        glMatrixMode(GL_PROJECTION);
    
        glLoadIdentity();
        gluPerspective(45, (float) m_Setup.width / m_Setup.height, 0.1, 5000.0);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    
        glDepthFunc(GL_LEQUAL);
        glEnable(GL_DEPTH_TEST);
    }
    
    void OGLRender::ready2D()
    {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    
        gluOrtho2D(0.0f, m_Setup.width, m_Setup.height, 0.0f);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0.375, 0.375, 0.0);
    
        glDisable(GL_DEPTH_TEST);
    }
    
    void OGLRender::render3D()
    {
        this->ready3D();
    
        // ... draw 3D world scene here ...
    }
    
    void OGLRender::render2D()
    {
        this->ready2D();
    
        // ... draw GUI here ...
    }

और फिर मुख्य थ्रेड लूप में मैं मूल रूप से निम्नलिखित क्रम में विधियों को कॉल करूंगा:

while(m_drawFrame)
{
    gm_Render->render3D(); // draw 3D scene
    gm_Render->render2D(); // draw GUI

    SDL_GL_SwapBuffers(); // make drawn frame visible
}

इसलिए, मैं जो कर रहा हूं, मैं अपने 3D विश्व दृश्य को पहले आकर्षित करता हूं और फिर मैं अपने GUI को अंतिम रूप से आकर्षित करता हूं, जिस तरह से GUI हमेशा विश्व दृश्य के शीर्ष पर होता है। रेडी 3 डी () विधि विश्व दृश्य ड्राइंग के लिए 3 डी विश्व प्रक्षेपण तैयार हो जाती है और जीयूआई ड्राइंग के लिए तैयार 2 डी ऑर्थो दृश्य के लिए तैयार विधि ( 2 डी ) प्राप्त होती है। m_Setup.widthऔर m_Setup.heightकेवल दृश्य पोर्ट स्क्रीन आयाम हैं।

रेडी 2 डी () विधि के बारे में विशेष बात यह है कि gluOrtho2D()फ़ंक्शन को तर्कों के साथ कहा जाता है जो यह बताता है कि जब हम जीयूआई प्राइमेटिव्स खींचते हैं तो हम उन्हें विंडोज, मैक और अन्य डेस्कटॉप स्क्रीन समन्वय प्रणालियों से मिलान करने के लिए निर्दिष्ट स्क्रीन निर्देशांक में खींचते हैं। जैसे टॉप-लेफ्ट (0,0) इन (X, Y) फॉर्मेट है जबकि बॉटम-राइट है (ViewportWidth-1, ViewportHeight-1)। और glTranslatef()प्रति-पिक्सेल सटीक स्थिति के लिए सही करने के लिए उपयोग किया जाता है। ताकि जब हम (0,0) से (0,9) के माध्यम से एक रेखा खींचते हैं, तो रेखा वास्तव में शीर्ष-बाएं और सीधे दस पिक्सेल कुल लंबाई और एक पिक्सेल चौड़ाई से नीचे आ जाएगी।

कुल मिलाकर आप अभी सबसे अधिक इच्छुक हैं कि रेडी 2 डी () विधि क्या कर रही है। मैंने आपको अन्य तरीकों के स्रोत कोड उदाहरण प्रदान किए हैं जिससे आप अंदाजा लगा सकते हैं कि ज्यादातर गेम 3 डी वर्ल्ड सीन और जीयूआई ड्राइंग ऑर्डर कैसे करते हैं।


धन्यवाद, मुझे नहीं पता था कि ऑर्थो और परिप्रेक्ष्य के बीच स्विच करना प्रदर्शन के लिए बुरा होगा, क्योंकि मेरे लिए यह एक बड़े ऑपरेशन की तरह लगता है (बेशक मैं मुश्किल से जानता हूं कि ओपनजीएल कैसे काम करता है ... अभी भी सीख रहा है!) लेकिन हर जगह मैंने किया है! देखा, और आपने क्या कहा, ऐसा करने का सुझाव देते हैं। इसलिए मुझे लगता है कि मैं :)
smoth190

मुझे यह पसंद है कि मैं क्या करने की सोच रहा था इसका जवाब पसंद है। मैं बस सोच रहा था कि अगर यह प्रत्येक 2 डी रेंडर पर प्रोजेक्शन मैट्रिक्स को धक्का देकर बेहतर किया जा सकता है तो इसके बाद इसे पॉपिंग करें। इसका मतलब है कि आप एक बार निश्चित रूप से 3 डी सेटअप कर सकते हैं? तब आपको केवल अपने 3D सेटअप को फिर से खिड़की के आकार में परिवर्तन के लिए कॉल करना होगा यदि आप इसे संभालते हैं।
लाइटबल्ब 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.