นี่เป็นเกมเอ็นจิ้นพื้นฐานจาก OpenGL ที่ฉันพยายามเขียนเมื่อประมาณเจ็ดปีก่อนที่เขียนใน C ++ เปลือยกับฉันขณะที่ฉันพยายามอธิบายว่าฉันจัดการกับโลก 3 มิติและ 2D GUI ในการแสดงผลได้อย่างไร ฉันใช้สี่วิธีหลักภายใน OpenGL renderer class (OGLRender) ของฉันซึ่ง ได้แก่ :
- ready3D ()สำหรับการเตรียม OpenGL เพื่อแสดงฉากโลก 3 มิติ
- ready2D ()สำหรับการเตรียม OpenGL เพื่อแสดง 2D GUI
- render3D ()สำหรับการวาดฉากโลก 3 มิติจริง
render2D ()สำหรับการวาด 2D GUI จริง
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
}
ดังนั้นสิ่งที่ฉันทำคือฉันวาดฉากโลก 3 มิติของฉันก่อนแล้วจึงวาด GUI ของฉันครั้งสุดท้ายเพื่อให้ GUI อยู่ด้านบนของฉากโลกเสมอ วิธี Ready3D ()ทำให้การฉายภาพ 3 มิติของโลกพร้อมสำหรับการวาดฉากโลกและวิธีการready2D ()ทำให้ฉาก Ortho 2D พร้อมสำหรับการวาด GUI m_Setup.width
และm_Setup.height
เป็นเพียงขนาดหน้าจอดูพอร์ต
มีอะไรพิเศษเกี่ยวกับเมธอด ready2D ()คือgluOrtho2D()
ฟังก์ชั่นนั้นถูกเรียกด้วยอาร์กิวเมนต์ที่บอกเมื่อเราวาดแบบพื้นฐานของ GUI ที่เราวาดในพิกัดหน้าจอที่ระบุให้ตรงกับ Windows, Mac และระบบพิกัดหน้าจอเดสก์ท็อปอื่น ๆ เช่นบนซ้ายเป็น (0,0) ในรูปแบบ (X, Y) (ViewportWidth-1, ViewportHeight-1)
ในขณะที่ด้านล่างขวาเป็น และglTranslatef()
ใช้สำหรับแก้ไขตำแหน่งที่แม่นยำต่อพิกเซล เพื่อว่าเมื่อเราลากเส้นจาก (0,0) ถึง (0,9) แล้วเส้นจะลากจากด้านบนซ้ายและตรงลงมาสิบพิกเซลทั้งหมดยาวและกว้างหนึ่งพิกเซล
โดยรวมแล้วคุณน่าจะสนใจในสิ่งที่เมธอด ready2D ()กำลังทำอยู่ ฉันได้ให้ตัวอย่างซอร์สโค้ดของเมธอดอื่นเพื่อให้แนวคิดแก่คุณเกี่ยวกับวิธีที่เกมส่วนใหญ่ทำฉากโลก 3 มิติและลำดับการวาด GUI
([0...1], [0...1], 0, 1)
ไม่มีการฉายมุมมองหรือเมทริกซ์โลกพวกมันจะลงจอดในพื้นที่หน้าจอเสมอ