यह एक पुराने 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 डी वर्ल्ड सीन और जीयूआई ड्राइंग ऑर्डर कैसे करते हैं।
([0...1], [0...1], 0, 1)
NO प्रक्षेपण, दृश्य या विश्व मैट्रिक्स के साथ निर्देशांक का उपयोग करते हैं , तो वे हमेशा स्क्रीन स्पेस में उतरेंगे।