2.ù¹ø° ¿¹Á¦

2-1.ÄÜ¼Ö ÇÁ·ÎÁ§Æ®

ù ¹ø° OpenGL ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ. ù ¿¹Á¦À̹ǷΠº¹ÀâÇÑ µµÇü ´ë½Å »ï°¢Çü Çϳª¸¸ ±×·Á º¸±â·Î ÇÑ´Ù. °³¹ß ÀýÂ÷¸¦ ½Ç½ÀÇØ º¸´Â °ÍÀÌ ÁÖµÈ ¸ñÀûÀ̹ǷΠ¼Ò½º ³»¿ëÀº ¾ÆÁ÷ ¸ô¶óµµ »ó°ü¾ø´Ù. ºñÁÖ¾ó ½ºÆ©µð¿À 2010À» ½ÇÇàÇÏ°í ´ÙÀ½ ½Ç½ÀÀ» ÁøÇàÇÑ´Ù. ¸Þ´º¿¡¼­ ÆÄÀÏ/»õ·Î¸¸µé±â/ÇÁ·ÎÁ§Æ® Ç׸ñÀ» ¼±ÅÃÇÑ´Ù.

Win32 ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥À» ¼±ÅÃÇÏ°í ÇÁ·ÎÁ§Æ® À̸§Àº ConsoleOpenGL·Î ÀÔ·ÂÇÑ´Ù. Àû´çÇÑ ½Ç½À Æú´õ¸¦ ¼±ÅÃÇ쵂 ÀÌ °­Á´ C:\OpenGLExam Æú´õ¿¡ ÀúÀåÇß´Ù. È®ÀÎ ¹öÆ°À» ´©¸£¸é ¸¶¹ý»ç°¡ ³ªÅ¸³ª¸ç ÀÀ¿ë ÇÁ·Î±×·¥ Á¾·ù°¡ ÄַܼΠÀÌ¹Ì ¼±ÅõǾî ÀÖ´Ù.

´Ù¸¥ ¿É¼ÇÀº °Çµå¸± ÇÊ¿ä¾ø°í Ãß°¡¿É¼Ç¿¡¼­ ºó ÇÁ·ÎÁ§Æ® üũ ¹Ú½º¸¦ ¼±ÅÃÇÑ´Ù. ¹Ì¸® Á¦°øµÇ´Â ÅÛÇø´À» »ç¿ëÇÏ´Â °Íµµ °¡´ÉÀº ÇÏ´Ù. ±×·¯³ª Å©·Î½º Ç÷§ÆûÀ» °í·ÁÇØ¾ß ÇϹǷΠ¹Ì¸® ÄÄÆÄÀÏµÈ Çì´õ´Ï ¸®¼Ò½º´Ï ÇÏ´Â °ÍµéÀº ¹èÁ¦ÇÏ´Â °ÍÀÌ ÁÁ´Ù.

¸¶¹ý»ç°¡ ¸¸µé¾î ÁÖ´Â ÇÁ·¹ÀÓ¿öÅ©´Â ½Ç¹« ÇÁ·ÎÁ§Æ®½Ã¿¡ »ó´çÈ÷ Æí¸®ÇÏÁö¸¸ ÀÌ·¸°Ô ¸¸µé¸é ºñÁÖ¾ó ½ºÆ©µð¿À Àü¿ëÀÇ ¿¹Á¦°¡ µÇ¾î ¹ö¸°´Ù. ¼Ò½º Â÷¿øÀÇ À̽ļº È®º¸¸¦ À§ÇØ °¡±ÞÀûÀÌ¸é ¼ø¼öÇÑ C ÄÚµå·Î ÀÛ¼ºÇÏ´Â °ÍÀÌ À¯¸®ÇÏ´Ù. ÇÁ·ÎÁ§Æ® ²®µ¥±â¸¸ ¸¸µç ÈÄ ÇÁ·ÎÁ§Æ®/»õ Ç׸ñ Ãß°¡¸¦ ¼±ÅÃÇÏ¿© ¼Ò½º ÆÄÀÏÀ» ¸¸µç´Ù.

¾Æ¹« ³»¿ëµµ ¾ø´Â ºó ¼Ò½º ÆÄÀÏÀÌ ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡µÈ´Ù. ÀÌ ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù. OpenGLÀÇ Hello World ¹öÀüÀ̶ó°í ÇÒ ¼ö Àִµ¥ ÃÖ´ëÇÑ °£´ÜÇÏ°Ô ÀÛ¼ºÇß´Ù.

ConsoleOpenGL

#include <gl/glut.h>

 

void DoDisplay()

{

     glClear(GL_COLOR_BUFFER_BIT);

 

     glBegin(GL_TRIANGLES);

     glVertex2f(0.0, 0.5);

     glVertex2f(-0.5, -0.5);

     glVertex2f(0.5, -0.5);

     glEnd();

     glFlush();

}

 

void main()

{

     glutCreateWindow("OpenGL");

     glutDisplayFunc(DoDisplay);

     glutMainLoop();

}

 

OpenGLÀ» »ç¿ëÇÏ·Á¸é ÁÖ¿ä Çì´õ ÆÄÀÏÀÎ gl.h¿Í glu.hµµ Æ÷ÇÔ½ÃÅ°´Â °ÍÀÌ ¿øÄ¢ÀûÀ̳ª ÀÌ ¿¹Á¦´Â glut.h Çϳª¸¸ Æ÷ÇÔ½ÃÄ×´Ù. glut Çì´õ ÆÄÀÏÀ» ¿­¾î º¸¸é ´ÙÀ½°ú °°Àº ±¸¹®ÀÌ Àֱ⠶§¹®ÀÌ´Ù. ¾Ë¾Æ¼­ ÇÊ¿äÇÑ ÆÄÀÏÀ» Æ÷ÇÔ½ÃÄÑ ÁֹǷΠÀÌ Çì´õ ÆÄÀÏ Çϳª¸¸ Æ÷ÇÔÇÏ¸é µÈ´Ù.

 

#include <GL/gl.h>

#include <GL/glu.h>

 

¿ÜºÎ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ·Á¸é ÀÓÆ÷Æ® ¶óÀ̺귯¸®µµ ¿¬°áÇØ¾ß ÇÑ´Ù. ÇÁ·ÎÁ§Æ® ¿É¼ÇÀÇ ¼³Á¤ ÆäÀÌÁö¿¡¼­ opengl32.lib, glu32.lib, glut32.lib¸¦ ¸µÅ©ÇØ¾ß Çϴµ¥ glut.h¿¡ ´ÙÀ½ ±¸¹®ÀÌ ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ±×·¯Áö ¾Ê¾Æµµ »ó°ü¾ø´Ù.

 

#pragma comment (lib, "opengl32.lib")  /* link with Microsoft OpenGL lib */

#pragma comment (lib, "glu32.lib")     /* link with OpenGL Utility lib */

#pragma comment (lib, "glut32.lib")    /* link with Win32 GLUT lib */

 

ÀÌ ±¸¹®Àº ºñÁÖ¾ó C++ÀÇ È®Àå ¹®¹ýÀ̸ç Çì´õ ÆÄÀÏ¿¡¼­ ÇÊ¿äÇÑ ¼³Á¤À» Á÷Á¢ º¯°æÇϹǷΠ¾ÆÁÖ Æí¸®ÇÏ´Ù. °á±¹ OpenGLÀ» »ç¿ëÇϱâ À§ÇÑ Áغñ´Â glut.h Çì´õ ÆÄÀÏ Çϳª¸¸ Æ÷ÇÔÇÏ¸é µÇ´Â ¼ÀÀÌ´Ù. ÄÄÆÄÀÏÇÏ¿© ½ÇÇàÇØ º¸ÀÚ. ÄÜ¼Ö ÇÁ·ÎÁ§Æ®À̹ǷΠÄܼÖâÀÌ ¸ÕÀú ¶ß°í º°µµÀÇ ±×·¡ÇÈâÀÌ ½ÇÇàµÇ¾î Èò»ö »ï°¢Çü Çϳª¸¦ ±×¸± °ÍÀÌ´Ù.

µÚÂÊÀÇ ÄܼÖâÀº º° ÇÏ´Â ÀÏ ¾øÀÌ ±×³É ½ÇÇàµÈ °ÍÀÌ°í »ï°¢ÇüÀÌ ±×·ÁÁø À©µµ¿ì°¡ OpenGLâÀÌ´Ù. »ï°¢ÇüÀ» Ãâ·ÂÇϱ⸸ ÇÒ »Ó ¾ÆÁ÷ º°´Ù¸¥ Äڵ尡 ¾øÀ¸¹Ç·Î ÀԷ¿¡´Â ÀüÇô ¹ÝÀÀÇÏÁö ¾Ê´Â´Ù. âÀÇ Å©±â¸¦ Á¶Á¤ÇÏ¸é »ï°¢Çü Å©±âµµ ºñ·ÊÀûÀ¸·Î ¹Ù²ï´Ù.

2-2.À©µµ¿ì ÇÁ·ÎÁ§Æ®

ÄÜ¼Ö ÇÁ·ÎÁ§Æ®µµ Win32 ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ°í glut°¡ ±×·¡ÇÈ Ã¢À» »ý¼ºÇØ ÁֹǷΠ½Ç½À¿¡ º° ¹®Á¦´Â ¾ø´Ù. ÇüÅ°¡ ´Ü¼øÇؼ­ ¼Ò½º¾çÀÌ Àû°í C Ç¥ÁØÀ» ÁؼöÇϹǷΠ´Ù¸¥ ¿î¿µÃ¼Á¦³ª ÄÄÆÄÀÏ·¯¿¡¼­µµ ¼öÁ¤¾øÀÌ ÄÄÆÄÀϵȴÙ. ÇѸ¶µð·Î À̽ļºÀÌ ¶Ù¾î³ª´Ù. ±×·¯³ª ÄܼÖâÀÌ ¶á ÈÄ ½ÇÇà À©µµ¿ì°¡ ¶á´Ù´Â ¸é¿¡¼­ º¸±â ÁÁÁö ¾Ê°í Å×½ºÆ® ÈÄ ÄܼÖâµµ Á÷Á¢ ´Ý¾Æ¾ß ÇÑ´Ù´Â ¸é¿¡¼­ ºÒÆíÇÏ´Ù.

´ÙÀ½Àº À©µµ¿ì ¹öÀüÀÇ ¿¹Á¦¸¦ ÀÛ¼ºÇØ º¸ÀÚ. »õ ÇÁ·ÎÁ§Æ®¸¦ ¸¸µéµÇ Win32 ÇÁ·ÎÁ§Æ® Ç׸ñÀ» ¼±ÅÃÇÏ°í ÇÁ·ÎÁ§Æ® À̸§Àº WinOpenGL·Î ÀÔ·ÂÇÑ´Ù.

¸¶¹ý»ç´Â ÀÀ¿ë ÇÁ·Î±×·¥ Á¾·ù ¿É¼ÇÀ» Windows ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î ¼±ÅÃÇØ ÁØ´Ù. ÄÜ¼Ö ÇÁ·ÎÁ§Æ®¿Í ¸¶Âù°¡Áö·Î ¾Æ·¡ÂÊÀÇ ºó ÇÁ·ÎÁ§Æ® ¿É¼ÇÀ» ¼±ÅÃÇÑ´Ù.

WinOpenGL.cpp ÆÄÀÏÀ» ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ÇÏ°í ´ÙÀ½ ¼Ò½º¸¦ ÀÛ¼ºÇÑ´Ù.

 

WinOpenGL

#include <windows.h>

#include <gl/glut.h>

 

void DoDisplay()

{

     glClear(GL_COLOR_BUFFER_BIT);

 

     glBegin(GL_TRIANGLES);

     glVertex2f(0.0, 0.5);

     glVertex2f(-0.5, -0.5);

     glVertex2f(0.5, -0.5);

     glEnd();

     glFlush();

}

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

       ,LPSTR lpszCmdParam,int nCmdShow)

{

     glutCreateWindow("OpenGL");

     glutDisplayFunc(DoDisplay);

     glutMainLoop();

     return 0;

}

 

ÄÜ¼Ö ÇÁ·ÎÁ§Æ®¿Í ¼Ò½º ³»¿ëÀº °ÅÀÇ µ¿ÀÏÇÏ´Ù. ÁøÀÔÁ¡ÀÌ main¿¡¼­ WinMainÀ¸·Î ¹Ù²î¾ú°í WinMainÀÇ Àμö¿¡ »ç¿ëµÈ ŸÀÔµéÀ» À§ÇØ windows.h¸¦ Æ÷ÇÔÇÑ Á¤µµ¸¸ ´Ù¸£´Ù. ½ÇÇàÇØ º¸ÀÚ.

½ÇÇà °á°ú´Â µ¿ÀÏÇ쵂 ÄܼÖâÀÌ ¿­¸®Áö ¾Ê°í ¹Ù·Î OpenGL À©µµ¿ì°¡ ¿­¸®¹Ç·Î ÈξÀ ´õ ±ò²ûÇÏ°í Æí¸®ÇÏ´Ù. ±×·¯³ª WinMainÀº À©µµ¿ìÁî ¿î¿µÃ¼Á¦¿¡¼­¸¸ Á¸ÀçÇÏ´Â ÁøÀÔÁ¡À̹ǷΠ¸®´ª½º³ª ¸ÅŲÅä½Ã¿¡¼­´Â ÀÌ ¿¹Á¦¸¦ ½ÇÇàÇØ º¼ ¼ö ¾ø´Ù´Â ¸ÍÁ¡ÀÌ ÀÖ´Ù. Ÿ ȯ°æ¿¡¼­´Â WinMainÀ» mainÀ¸·Î ¹Ù²ã Áà¾ß¸¸ ÄÄÆÄÀϵȴÙ. ÄÜ¼Ö ÇÁ·ÎÁ§Æ®°¡ Á» ±¸´Ú´Ù¸®ÀÌ°í âÀÌ µÎ°³³ª ¿­·Á ºÒÆíÇÏÁö¸¸ À̽ļºÀº ÈξÀ ´õ ÁÁ´Ù.

»ç½Ç µÎ ÇÁ·ÎÁ§Æ® Çü½ÄÀº °ÅÀÇ Â÷ÀÌ°¡ ¾ø´Ù. ÀÌ Ã¥¿¡¼­´Â À©µµ¿ì ¹öÀüÀ¸·Î ¿¹Á¦¸¦ ¸¸µé±â·Î ÇÑ´Ù. ¿Ö³ÄÇÏ¸é ´ëºÎºÐÀÇ »ç¶÷µéÀÌ À©µµ¿ìÁî ȯ°æ¿¡¼­ ½Ç½ÀÀ» ÇÒ °ÍÀÌ°í ¸Å ½Ç½À¸¶´Ù âÀ» µÎ °³¾¿À̳ª ¿­¾ú´Ù ´Ý¾Ò´Ù ÇÏ´Â °ÍÀÌ ³Ê¹« ºÒÆíÇϱ⠶§¹®ÀÌ´Ù. 2~3°³ÀÇ ¿¹Á¦¸¦ °°ÀÌ ½ÇÇàÇØ ³õ°í ºñ±³ÇÒ ¶§´Â âÀÌ 4°³, 6°³¾¿À̳ª ¿­¸®¹Ç·Î Á¤½ÅÀÌ ¾öû »ç³³´Ù. ½Ç¹« ÇÁ·ÎÁ§Æ®°¡ ¾Æ´Ï¶ó ÇнÀ¿ëÀ̹ǷΠÇнÀ¿¡ È¿À²ÀûÀÎ ÂÊÀ¸·Î ¼±ÅÃÇß´Ù.

2-3.Dev-C++

´ÙÀ½Àº °ø°³ ÄÄÆÄÀÏ·¯ Dev-C++·Î ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé¾î º¸ÀÚ. »ç½Ç ºñÁÖ¾ó ½ºÆ©µð¿À´Â OpenGL ½Ç½À¿ëÀ¸·Î »ç¿ëÇϱ⿡´Â ³Ê¹« µ¢Ä¡°¡ Å©°í À¯·á ÇÁ·Î±×·¥ÀÌ¶ó ²¬Â½Áö±ÙÇÑ ¸éÀÌ ÀÖ´Ù. Dev-C++ 4992¸¦ ¼³Ä¡ÇÑ ÈÄ ´ÙÀ½ ¼ø¼­´ë·Î ÇÁ·ÎÁ§Æ®¸¦ ÀÛ¼ºÇÑ´Ù. ÄÜ¼Ö ¹öÀüµµ ÀÛ¼ºÇÒ ¼ö ÀÖÁö¸¸ À©µµ¿ì ¹öÀüÀ» ¹Ù·Î ¸¸µé¾î º¸ÀÚ. ÆÄÀÏ/»õ·Î ¸¸µé±â/ÇÁ·ÎÁ§Æ® Ç׸ñÀ» ¼±ÅÃÇÑ´Ù.

À§ÂÊÀÇ ÅÛÇø´¿¡¼­ Windows Application Ç׸ñÀ» ¼±ÅÃÇÏ°í ÇÁ·ÎÁ§Æ® À̸§Àº DevOpenGL·Î ÁØ´Ù. È®ÀÎ ¹öÆ°À» ´©¸£¸é ÇÁ·ÎÁ§Æ®¸¦ ÀúÀåÇϴµ¥ ÇÁ·ÎÁ§Æ® Æú´õ¸¦ º°µµ·Î »ý¼ºÇØ ÁÖÁö ¾ÊÀ¸¹Ç·Î WinOpenGL Æú´õ¸¦ »ý¼ºÇÑ ÈÄ ÀúÀåÇÏ´Â °ÍÀÌ ÁÁ´Ù. Ž»ö±â¸¦ ±»ÀÌ ¿­ ÇÊ¿ä´Â ¾ø°í ÀúÀå ´ëÈ­»óÀÚ À§ÂÊÀÇ »õ Æú´õ ¹öÆ°À» ´©¸£¸é µÈ´Ù. C:\OpenGLExam Æú´õ·Î À̵¿ÇÑ ÈÄ DevOpenGL À̶ó´Â Æú´õ¸¦ ¸¸µé°í ÀÌ Æú´õ ¾È¿¡ DevOpenGL.dev ÆÄÀÏÀ» ÀúÀåÇÑ´Ù.

main.cpp°¡ ±âº»ÀûÀ¸·Î Á¦°øµÇ¸ç ÀÌ ¼Ò½º¿¡´Â ÀϹÝÀûÀÎ Win32 ÇÁ·ÎÁ§Æ®°¡ ÀÌ¹Ì ÀԷµǾî ÀÖ´Ù. OpenGL°ú´Â ¸ÂÁö ¾ÊÀ¸¹Ç·Î ÀüºÎ Áö¿î ÈÄ ´Ù½Ã ÀÔ·ÂÇÑ´Ù.



DevOpenGL

#include <windows.h>

#include <gl/glut.h>

 

void DoDisplay()

{

     glClear(GL_COLOR_BUFFER_BIT);

 

     glBegin(GL_TRIANGLES);

     glVertex2f(0.0, 0.5);

     glVertex2f(-0.5, -0.5);

     glVertex2f(0.5, -0.5);

     glEnd();

     glFlush();

}

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

       ,LPSTR lpszCmdParam,int nCmdShow)

{

     glutCreateWindow("OpenGL");

     glutDisplayFunc(DoDisplay);

     glutMainLoop();

     return 0;

}

 

ºñÁÖ¾ó C++ ÇÁ·ÎÁ§Æ®ÀÇ ¼Ò½º¿Í ´Ü ÇѱÛÀÚµµ Ʋ¸®Áö ¾Ê°í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. µðÆúÆ® ÆÄÀϸíÀÌ main.cpp·Î µÇ¾î Àִµ¥ ÀÌ ÆÄÀϸíÀ» ±×´ë·Î »ç¿ëÇصµ »ó°üÀº ¾øÁö¸¸ Â÷ÈÄ ÇÁ·ÎÁ§Æ® °ü¸®½Ã¿¡ ºÒÆíÇÏ´Ù. ÀúÀå ¹öÆ°À» ´­·¯ DevOpenGL.cpp ÆÄÀÏ·Î À̸§À» ¹Ù²Ù¾î ÀúÀåÇÏ´Â °ÍÀÌ ÁÁ´Ù.

ÀÓÆ÷Æ® ¶óÀ̺귯¸®¸¦ ¿¬°áÇÏ´Â #pragma comment ¹®Àº C Ç¥ÁØ ¹®¹ýÀÌ ¾Æ´Ï¸ç ºñÁÖ¾ó C++ÀÇ ÀÓÀÇ È®ÀåÀ̶ó Dev-C++¿¡¼­´Â µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. ±×·¡¼­ OpenGL ¶óÀ̺귯¸® ¿¬°áÀº ¼öÀÛ¾÷À¸·Î Á÷Á¢ ÇØ¾ß ÇÑ´Ù. ÇÁ·ÎÁ§Æ® ¿É¼ÇâÀÇ ¸Å°³º¯¼ö ÅÇÀÇ ¸µÄ¿¶õ¿¡ ´ÙÀ½ ¿É¼ÇÀ» Ãß°¡ÇÑ´Ù.

-l(´ë¹®ÀÚ ¾ÆÀÌ°¡ ¾Æ´Ï¶ó ¼Ò¹®ÀÚ ¿¤) ´ÙÀ½¿¡ ¿¬°áÇÒ ¶óÀ̺귯¸® À̸§À» Àû¾î ÁÖ¸é µÈ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÏ¸é °³¹ß ȯ°æÀº ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

ÀÌ »óÅ¿¡¼­ ÄÄÆÄÀÏ ¹× ½ÇÇàÇÏ¸é ºñÁÖ¾ó C++°ú µ¿ÀÏÇÑ ½ÇÇà ÆÄÀÏÀÌ ¸¸µé¾îÁø´Ù. ºñÁÖ¾ó C++¿¡ ºñÇØ ÀܼÕÁúÀÌ ´õ ÇÊ¿äÇÏ°í ´Ù¼Ò ºÒÆíÇÑ ¸éÀÌ ÀÖÁö¸¸ ÀϹÝÀûÀÎ ÄܼÖ, À©µµ¿ìÁî ¿¹Á¦ ÀÛ¼º¿¡´Â º° ºÎÁ·ÇÔÀÌ ¾ø´Ù.

ÀÌ ¿Ü¿¡ Áñ°Ü »ç¿ëÇÏ´Â ÄÄÆÄÀÏ·¯°¡ ÀÖ´Ù¸é ºñ½ÁÇÑ ¹æ¹ýÀ¸·Î ½Ç½ÀÇÒ ¼ö ÀÖ´Ù. Çì´õ ÆÄÀÏ ±¸Á¶³ª ÀÓÆ÷Æ® ¶óÀ̺귯¸® ¿¬°á ¹æ¹ý Á¤µµ¸¸ ´Ù¸¦ »ÓÀÌÁö ¼Ò½º ³»¿ëÀº µ¿ÀÏÇÏ´Ù. ¼Õ¿¡ ÀÍÀº ÄÄÆÄÀÏ·¯°¡ ÀÖ´Ù¸é ±× ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇϱ⠹ٶõ´Ù.

2-4.ù¹ø° ¿¹Á¦ ºÐ¼®

ù ¹ø° ¿¹Á¦¸¦ ´ëÃæ ºÐ¼®ÇØ º¸ÀÚ. »ó¼¼ÇÑ ÇÔ¼ö ±¸¹®Àº Â÷ÈÄ ÃµÃµÈ÷ ¾Ë¾Æ º¸±â·Î ÇÏ°í ÀüüÀûÀÎ ±¸Á¶¸¸ ºÐ¼®ÇØ º»´Ù. ¸ÞÀÎ ÇÔ¼öÀÇ ÄÚµå´Â ´ÙÀ½ ¼¼ ÁÙ·Î µÇ¾î Àִµ¥ ÇÔ¼öÀÇ Á¢µÎ°¡ ¸ðµÎ glut·Î µÇ¾î ÀÖ´Ù. Áï ÀÌ ÇÔ¼öµéÀº ±×·¡ÇÈ Ãâ·Â ȯ°æÀ» ¸¸µé¾î ÁÖ´Â GLUT ¸í·É¾îµéÀÌ´Ù.

 

glutCreateWindow("OpenGL");

glutDisplayFunc(DoDisplay);

glutMainLoop();

 

glutCreateWindow ÇÔ¼ö´Â OpenGL Ãâ·ÂÀ» À§ÇÑ À©µµ¿ì¸¦ »ý¼ºÇÑ´Ù. Àμö·Î´Â ŸÀÌƲ ¹Ù¿¡ Ãâ·ÂµÉ Á¦¸ñ ¹®ÀÚ¿­À» Àü´ÞÇÑ´Ù. ÀÌ ÇÔ¼ö¿¡ ÀÇÇØ 300 * 300 Å©±âÀÇ ±×¸®±â Ç¥¸éÀ» °¡Áö´Â À©µµ¿ì°¡ »ý¼ºµÇ¸ç ÀÌÈÄ ÀÌ À©µµ¿ì¿¡ 3Â÷¿ø ±×·¡ÇÈÀÌ Ãâ·ÂµÈ´Ù.

glutDisplayFunc ÇÔ¼ö´Â À©µµ¿ì¿¡ ±×¸®±â¸¦ Àü´ãÇÏ´Â ÇÔ¼ö(WM_PAINT ¸Þ½ÃÁö ó¸® ÇÔ¼ö)¸¦ ÁöÁ¤ÇÑ´Ù. À©µµ¿ì°¡ óÀ½ »ý¼ºµÉ ¶§, Å©±â°¡ º¯ÇÒ ¶§, Ãâ·Â ³»¿ëÀ» ¹Ù²Ù¾úÀ» ¶§ µî¿¡ ±×¸®±â ÇÔ¼ö°¡ È£ÃâµÈ´Ù. ÀÌ ¿¹¿¡¼­´Â DoDisplay ÇÔ¼ö¸¦ ÁöÁ¤Çß´Ù. DoDisplay ÇÔ¼ö´Â ¸ÞÀÎ ÇÔ¼ö ¹Ù·Î À§¿¡ Á¤ÀǵǾî ÀÖÀ¸¸ç ¿©±â¼­ »ï°¢ÇüÀ» ±×¸°´Ù.

glutMainLoop  ÇÔ¼ö´Â ¸Þ½ÃÁö ·çÇÁ¸¦ µ¹¸°´Ù. ±×·¡ÇÈ È­¸éÀº ±×¸®±â, â Å©±â º¯È­, »ç¿ëÀÚ ÀÔ·Â µîÀÇ »ç°Ç¿¡ ´ëÇØ ¹ÝÀÀÇÏ´Â À̺¥Æ® µå¸®ºì ¹æ½ÄÀ¸·Î µ¿ÀÛÇÏ¸ç ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ Àû´çÇÑ ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö¿¡ ÀÇÇØ À©µµ¿ì »ý¼º Á÷ÈÄ¿¡ DoDisplay°¡ È£ÃâµÇ°í ±×¸²ÀÌ ±×·ÁÁö¸ç ½ÇÇàÀ» ½ÃÀÛÇÑ´Ù. ¸Þ½ÃÁö ·çÇÁ´Â ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ ¶§±îÁö °è¼Ó ½ÇÇàµÈ´Ù.

ÁøÀÔ ÇÔ¼ö´Â À©µµ¿ì »ý¼º, ±×¸®±â ÇÔ¼ö ÁöÁ¤, ¸Þ½ÃÁö ·çÇÁ ½ÇÇà 3°¡Áö ¸í·ÉÀ» ½ÇÇàÇÔÀ¸·Î½á ÇÁ·Î±×·¥À» ÃʱâÈ­Çß´Ù. OpenGL ¿¹Á¦¸¦ À§ÇÑ ÃÖ¼ÒÇÑÀÇ ¸í·ÉÀÎ ¼ÀÀÌ´Ù. ÀÌ ¿Ü¿¡ Ư¼öÇÑ ÃʱâÈ­ ¸í·ÉÀ̳ª Äݹé ÇÔ¼ö ÁöÁ¤ µîÀÌ ´õ µé¾î°¥ ¼ö ÀÖ´Ù. Å°º¸µå ÀÔ·ÂÀ» ¹ÞÀ¸·Á¸é glutKeyboardFuncÀ¸·Î Å°º¸µå¸¦ ó¸®ÇÒ ÇÔ¼ö¸¦ ÁöÁ¤ÇÏ´Â ½ÄÀÌ´Ù. ÀÌ ¿¹Á¦´Â ´Ü¼øÇÑ ±×¸®±â¸¸ ÇϹǷΠ±×¸®±â Äݹé ÇÔ¼ö¸¸ ÁöÁ¤Çß´Ù.

´ÙÀ½Àº ½ÇÁ¦ ±×¸®±â¸¦ ¼öÇàÇÏ´Â DoDisplay ÇÔ¼ö¸¦ ºÐ¼®ÇØ º¸ÀÚ. »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼öÀ̹ǷΠÀ̸§Àº ¹°·Ð ¸¶À½´ë·Î Á¤ÇÒ ¼ö ÀÖ´Ù. ¸ÞÀÎ ÇÔ¼ö ¹Ù·Î À§ÂÊ¿¡ Á¤ÀǵǾî ÀÖÀ¸¸ç º°µµÀÇ Àμö´Â ¹Þ¾ÆµéÀÌÁö ¾Ê´Â´Ù. Ãâ·Â ³»¿ëÀÌ ¹Ù²ð ¶§¸¶´Ù È­¸éÀ» ±ò²ûÇÏ°Ô Áö¿ì±â À§ÇØ glClear ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. glBeginÀº µµÇüÀ» ±×¸®±â ½ÃÀÛÇÑ´Ù´Â ¶æÀÌ°í glEnd´Â µµÇüÀ» ´Ù Á¤ÀÇÇß´Ù´Â ¶æÀÌ´Ù. ÀÌ µÎ ÇÔ¼ö È£Ãâ¹® »çÀÌ¿¡ µµÇüÀ» ±¸¼ºÇÏ´Â Á¤Á¡µéÀÌ ¹èÄ¡µÈ´Ù.

Á¤Á¡µéÀ» ¾î¶»°Ô ¿¬°áÇÒ °ÍÀΰ¡´Â glBeginÀÇ Àμö·Î ÁöÁ¤Çϴµ¥ GL_TRIANGLES·Î ÁÖ¾úÀ¸¹Ç·Î ¼¼ Á¤Á¡µéÀÌ ¿¬°áµÇ¾î »ï°¢ÇüÀÌ ±×·ÁÁø´Ù. OpenGLÀÇ ÁÂÇ¥°è´Â ´Ù¾çÇÏ°Ô Á¤ÀÇÇÒ ¼ö ÀÖÁö¸¸ º°´Ù¸¥ ÁöÁ¤ÀÌ ¾øÀ» ¶§ÀÇ µðÆúÆ® ÁÂÇ¥°è´Â ´ÙÀ½°ú °°´Ù. z ÃàÀº ÀÏ´Ü ¹«½ÃÇÏ°í x, y Æò¸éÃุ º¸ÀÚ. ¹°·Ð ¾îµð±îÁö³ª µðÆúÆ®ÀÏ »ÓÀ̸ç ÁÂÇ¥°è´Â ´Ù¾çÇÑ ¹æ½ÄÀ¸·Î º¯Çü °¡´ÉÇÏ´Ù.

È­¸éÀÇ Áß¾ÓÀÌ (0,0)ÀÌ°í X ÃàÀº ¿À¸¥ÂÊÀ¸·Î, Y ÃàÀº À§ÂÊÀ¸·Î Áõ°¡ÇÑ´Ù. ¿À¸¥ÂÊ À§ ¸ð¼­¸® ÁÂÇ¥´Â (1,1)ÀÌ¸ç ¿ÞÂÊ ¾Æ·¡´Â (-1, -1)ÀÌ´Ù. ÀÓÀÇÀÇ ÇÑ Á¡Àº -1 ~ 1 »çÀÌÀÇ ½Ç¼ö°ªÀ¸·Î ÁöÁ¤ÇÑ´Ù. glBegin°ú glEnd »çÀÌÀÇ glVertex2f ÇÔ¼ö·Î ÁöÁ¤ÇÑ ¼¼ Á¡ÀÌ »ï°¢ÇüÀÇ ²ÀÁöÁ¡À» °¡¸®Å°°í ÀÖÀ¸¸ç ÀÌ ¼¼ Á¡À» ¿¬°áÇÏ¿© »ï°¢ÇüÀ» ±×¸°´Ù. x, y µÎ °³ÀÇ °ª¸¸ ÁöÁ¤ÇßÀ¸¹Ç·Î z ÁÂÇ¥´Â ÀÚµ¿À¸·Î 0ÀÌ µÈ´Ù.

´Ù ±×¸° ÈÄ¿¡ glFlush·Î ±×¸®±â ¸í·ÉÀ» ±×·¡ÇÈ Ä«µå·Î º¸³» ±×¸°´Ù. OpenGLÀº ¼Óµµ¸¦ ³ôÀ̱â À§ÇØ ¸Å ±×¸®±â ¸í·ÉµéÀ» Áï½Ã ¼öÇàÇÏÁö ¾Ê°í ¹öÆÛ¿¡ ¸ð¾Æ µÎ¾ú´Ù°¡ ÇѲ¨¹ø¿¡ ¼öÇàÇÑ´Ù. glFlush´Â ¹öÆÛ¸¦ ºñ¿ö ¸í·ÉÀ» Áï½Ã ½ÇÇà½ÃŲ´Ù. ÀÌ È£ÃâÀ» »ý·«Çϸé Á¤Á¡¸¸ Á¤ÀÇµÉ »Ó Ãâ·ÂÀº ³ª°¡Áö ¾Ê´Â´Ù.

2-5.¹èÆ÷ ¿¹Á¦

¹º°¡¸¦ óÀ½ ¹è¿ï ¶§´Â ¸ðµç ¿¹Á¦¸¦ Á÷Á¢ ¸¸µé¾î º¸´Â °ÍÀÌ ÁÁ´Ù. ´«À¸·Î ÈÈ¾î º¸´Â °Í°ú ¼Õ°¡¶ôÀ¸·Î Á÷Á¢ ÀÔ·ÂÇØ °¡¸é ÄÚµå ÇÑÁÙ ÇÑÁÙÀ» Àд °ÍÀº ½Ç½ÀÀÇ ±íÀÌ°¡ È®¿¬ÇÏ°Ô ´Ù¸£´Ù. ¹®Á¦´Â ½Ã°£ÀÌ´Ù. ¿ì¸® ¸ðµÎ ±×·¸°Ô ÇÑ°¡ÇÑ »ç¶÷ÀÌ ¾Æ´Ï¾î¼­ ÇÁ·ÎÁ§Æ® ¸¸µé°í ¼Ò½º ÀÔ·ÂÇØ ³Ö°í ¿ä¸ð Á¶¸ð ¶â¾îº¼ ½Ã°£ÀÌ ¾ø´Ù. ´çÀå ´ÙÀ½ ÁÖ±îÁö °á°ú°¡ ³ª¿ÀÁö ¾ÊÀ¸¸é ¾öû³² °¥±ÀÀ» °¢¿ÀÇØ¾ß ÇÏ´Â »ç¶÷µé ¾Æ´Ñ°¡?

±×·¡¼­ ÀÌ °­Á´ ¸ðµç ¿¹Á¦¸¦ ÄÄÆÄÀÏ °¡´ÉÇÑ ÇÁ·ÎÁ§Æ®·Î Á¦°øÇÑ´Ù. ÄÄÆÄÀÏ·¯ ¼³Ä¡ÇÏ°í ÇÁ·ÎÁ§Æ® ¿­¾î¼­ Á÷Á¢ ÄÄÆÄÀÏÇØ º¼ ¼öµµ ÀÖ°í Àǽɰ¡´Â ºÎºÐÀº ¸¶À½ ³»Å°´Âµ¥·Î ¶â¾î º¼ ¼öµµ ÀÖ´Ù. ±×·¯³ª ÀÌ ¶ÇÇÑ ½Ã°£ÀÌ ¸¹ÀÌ °É¸®´Â ÀÏÀÌ´Ù. ±×·¡¼­ ÀçÄÄÆÄÀÏÇÏÁö ¾Ê°íµµ ¸ðµç ¿¹Á¦¸¦ °¡±ÞÀûÀÌ¸é ½Å¼ÓÇÏ°Ô »ìÆ캼 ¼ö ÀÖµµ·Ï ¿¹Á¦¸¦ ÀÛ¼ºÇß´Ù.

OpenGLÀÇ ¿¹Á¦µéÀº ´ëºÎºÐ ±×¸®±â Äڵ尡 ÁÖÀ̹ǷΠ´Þ¶óÁö´Â ºÎºÐÀº DoDisplay Ãâ·Â ÇÔ¼öÀÇ ÄÚµå»ÓÀÌ´Ù. ÇÁ·ÎÁ§Æ®ÀÇ °ñ°ÝÀº °ÅÀÇ ºñ½ÁÇÏ¸ç ¹«¾ùÀ» ¾î¶»°Ô ±×¸®´Â°¡¸¸ ´Þ¶óÁú »ÓÀÌ´Ù. ±×·¡¼­ ¿¹Á¦¸¦ ³Ê¹« ¸¹ÀÌ ¸¸µéÁö ¾Ê°í ÇÑ ¿¹Á¦¿¡ ºñ½Á ºñ½ÁÇÑ Äڵ带 ÅëÇÕÀûÀ¸·Î ÀÛ¼ºÇØ µÎ¾ú´Ù. °¢°¢ÀÇ Äڵ带 ÁÖ¼®À¸·Î ¹­¾îµÎ´Â ¹æ¹ýµµ ÈçÈ÷ »ç¿ëµÇÁö¸¸ ±×·¯ÀÚ¸é ÁÖ¼® ÆíÁý ÈÄ ÀçÄÄÆÄÀÏÀ̶ó´Â ¹ø°Å·Î¿î °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù.

ÀÌ °­Á´ Æ˾÷ ¸Þ´º·Î °­Á¸¦ ¼±ÅÃÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù. ½ÇÇàÁß¿¡µµ ¾ðÁ¦µçÁö Æ˾÷ ¸Þ´º·Î ½ÇÇà Äڵ带 ¹Ù²ã º¼ ¼ö ÀÖ´Ù. Æ˾÷ ¸Þ´º¿¡¼­ ActionÀ̶ó´Â º¯¼ö¸¦ º¯°æÇÏ°í DoDisplay ÇÔ¼ö´Â Action º¯¼ö¿¡ µû¶ó ´Ù¸¥ Äڵ带 ½ÇÇàÇÏ´Â ½ÄÀÌ´Ù. ´ÙÀ½ Àý¿¡¼­ ¸¸µé¾î º¼ ChangeState ¿¹Á¦ÀÇ Àüü ¼Ò½º´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºµÇ¾î ¹èÆ÷µÈ´Ù. ¼¼ °³ÀÇ Äڵ尡 ÇÑ ¿¹Á¦¿¡ ÀÛ¼ºµÇ¾î ÀÖ´Â ¼ÀÀÌ´Ù.

 

#include <windows.h>

#include <gl/glut.h>

 

void DoDisplay();

void DoMenu(int value);

int Action;

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

       ,LPSTR lpszCmdParam,int nCmdShow)

{

     glutCreateWindow("OpenGL");

     glutDisplayFunc(DoDisplay);

     glutCreateMenu(DoMenu);

     glutAddMenuEntry("»¡°£»ö ¹è°æ",0);

     glutAddMenuEntry("»¡°£»ö »ï°¢Çü",1);

     glutAddMenuEntry("¿À°¢Çü ±×¸®±â",2);

     glutAttachMenu(GLUT_RIGHT_BUTTON);

     glutMainLoop();

     return 0;

}

 

void DoMenu(int value)

{

     if (value < 100) {

          Action = value;

          glClearColor(0.0, 0.0, 0.0, 1.0);

          glColor3f(1.0, 1.0, 1.0);

          glutPostRedisplay();

          return;

     }

}

 

void DoDisplay()

{

switch(Action) {

case 0:

     ....

     break;

case 1:

     ....

     break;

case 2:

     ....

     break;

}

}

 

 

WinMainÀº Àß º¯ÇÏÁö ¾ÊÀ¸¹Ç·Î À§ÂÊ¿¡ Á¤ÀÇÇÏ°í DoDisplay´Â ¾Æ·¡ÂÊ¿¡ µÎµÇ ¹Ì¸® ¿øÇüÀ» ¼±¾ðÇØ µÎ¾ú´Ù. DoDisplay ÇÔ¼ö´Â switch ¹®À¸·Î Action¿¡ µû¶ó ´Ù¸¥ µ¿ÀÛÀ» ÇÑ´Ù. case ¹®ÀÇ Äڵ尡 ÇϳªÀÇ ¿¹Á¦¿¡ ´ëÀÀµÈ´Ù. ½ÇÇàÁß¿¡ ¾ðÁ¦µçÁö Æ˾÷ ¸Þ´º¸¦ ¿­¸é ActionÀ» ¹Ù²Ü ¼ö ÀÖ´Â ¸í·ÉµéÀÌ ³ªÅ¸³ª¸ç Ä£ÀýÇÏ°Ô Çѱ۷Π¼³¸íµµ ºÙ¿© ³õ¾Ò´Ù.

º»¹®¿¡¼­ Äڵ带 º¸ÀÏ ¶§´Â case ¹® ¾ÈÂÊÀÇ Äڵ常 º¸ÀÏ °ÍÀÌ´Ù. ¿©·¯ °³ÀÇ Äڵ带 ÇϳªÀÇ ¿¹Á¦¿¡ ¹­´Ù º¸´Ï ´Ù¼Ò ºÎÀÚ¿¬½º·¯¿î ¸éµµ ÀÖ´Ù. ActionÀ» º¯°æÇÒ ¶§¸¶´Ù ´Ù¸¥ ¿¹Á¦°¡ º¯°æÇÑ ¼³Á¤À» ¿ø·¡´ë·Î µ¹¸®´Â Äڵ尡 ÇÊ¿äÇÏ´Ù. ¶Ç case¹®¾È¿¡ º¯¼ö ÃʱâÈ­¸¦ ÇÒ ¼ö ¾øÀ¸¹Ç·Î Ãß°¡ÀûÀº { } °ýÈ£°¡ »ç¿ëµÇ±âµµ ÇÑ´Ù. switch¹®Àº ¾îµð±îÁö³ª ¿¹Á¦ ¼±ÅÃÀ» À§ÇÑ ±¸¹®À̹ǷΠµé¿© ¾²±âµµ ÇÏÁö ¾Ê¾Ò´Ù.

½ÇÇàÁß¿¡ ȸÀüÀ̳ª Àμö°ªÀÇ Áõ°¨À» À§ÇØ ¾ËÆĺªÅ°µµ Á¾Á¾ »ç¿ëÇÑ´Ù. Å°´Â ¿¹Á¦¸¶´Ù Á¶±Ý¾¿ ´Ù¸¥µ¥ °³º° ¿¹Á¦¿¡¼­ ¼³¸íÇÑ´Ù. ¹èÆ÷ ¿¹Á¦ÀÇ Çü½ÄÀÌ ´Ù¼Ò ºñ»ó½ÄÀûÀÌÁö¸¸ ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ¸¸é ¿¹Á¦ÀÇ ¼ö°¡ ³Ê¹« ¸¹¾ÆÁø´Ù. ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ±âº»ÀûÀÎ °³³äÀÌ ÀÖ´Ù¸é ¹èÆ÷ ¿¹Á¦ÀÇ Çü½ÄÀº ¾î·ÆÁö ¾Ê°í ¼ö±àµÉ °ÍÀÌ´Ù. ¸ðµç ¿¹Á¦°¡ ½ÇÇà ÆÄÀϾȿ¡ ´Ù µé¾î ÀÖÀ¸¹Ç·Î ÄÄÆÄÀÏ·¯¸¦ ¿­Áö ¾Ê°í °­ÁÂ¿Í ½ÇÇà ÆÄÀϸ¸ º¸¾Æµµ ³»¿ëÀ» ÀÌÇØÇÒ ¼ö ÀÖ´Ù.

¾ÕºÎºÐ óÀ½ÀÇ ½Ç½À ¿¹Á¦ ¸î °³¸¦ Á¦¿ÜÇÏ°í ³ª¸ÓÁö ¿¹Á¦´Â ¸ðµÎ ºñÁÖ¾ó ½ºÆ©µð¿ÀÀÇ ¼Ö·ç¼ÇÀ¸·Î ¹­¾î µÎ¾ú´Ù. ÄÄÆÄÀÏÇØ º¼ ¶§µµ ÇÁ·ÎÁ§Æ®¸¦ ±³Ã¼ÇÒ ÇÊ¿ä¾øÀÌ Æ˾÷ ¸Þ´º¿¡¼­ ½ÃÀÛ ÇÁ·ÎÁ§Æ®¸¸ º¯°æÇÔÀ¸·Î½á »ìÆ캼 ¼ö ÀÖ´Ù. ¾Èµå·ÎÀÌµå ¿¹Á¦µµ ÇϳªÀÇ ÅëÇÕ ¿¹Á¦¿¡ ¸ñ·Ï Çü½ÄÀ¸·Î ÀÛ¼ºµÇ¾î ÀÖÀ¸¸ç ¾×ƼºñƼ Çϳª°¡ ¿¹Á¦ Çϳª¿¡ ´ëÀÀµÈ´Ù.