7.¹öÅؽº ¹è¿­

7-1.¹öÅؽº ¹è¿­

ÀÔü µµÇüÀº ¾ÆÁÖ ¸¹Àº Á¤Á¡µé°ú °ü·Ã Á¤º¸µé·Î ±¸¼ºµÈ´Ù. ±×·²½ÎÇÑ ÀÔü µµÇü Çϳª¸¦ ¸¸µé·Á glVertex ÇÔ¼ö¸¦ ¼öõ, ¼ö¸¸¹øÀ» È£ÃâÇØ¾ß ÇÏ°í °¢ Á¤Á¡¸¶´Ù »ö»óÀ̳ª ¹ý¼± Á¤º¸µµ ÇÊ¿äÇÏ´Ù. Á¤º¸°¡ ¸¹Àº °ÍÀº ¾î¿ ¼ö ¾ø´Â ÀÏÀÌÁö¸¸ °¢ Á¤º¸¸¶´Ù ÇÔ¼ö¸¦ ÀÏÀÏÀÌ È£ÃâÇÏ´Â °ÍÀº ³¶ºñ°¡ ³Ê¹« ½ÉÇÏ´Ù. ¾Ë´Ù½ÃÇÇ ÇÔ¼ö È£ÃâÀº ½ÇÇà ÆÄÀÏ Å©±â¸é¿¡¼­³ª ¼Óµµ¸é¿¡¼­³ª ºñ¿ëÀÌ ²Ï ºñ½Ñ µ¿ÀÛÀÌ´Ù.

°¢ Á¤Á¡¸¶´Ù ´Þ¶óÁö´Â °ÍÀº ÁÂÇ¥ÀÏ »ÓÀ̹ǷΠÀÌ ÁÂÇ¥µéÀ» ÇϳªÀÇ ¹è¿­¿¡ ¸ð¾Æ µÐ ÈÄ ·çÇÁ¸¦ µ¹¸®¸é¼­ ¹è¿­ ¿ä¼Ò¸¦ Çϳª¾¿ Àü´ÞÇÏ´Â °ÍÀÌ ±¸Á¶ÀûÀ¸·Î ÈξÀ ´õ ³ªÀº ¹æ¹ýÀÌ´Ù. ÇÁ·Î±×·¡¹ÖÀÇ ±âº»À» ¾Æ´Â »ç¶÷À̶ó¸é ¹Ýº¹ÀÌ °úµµÇØÁú ¶§ ´ç¿¬È÷ ÀÌ ¹æ¹ýÀ» ¶°¿Ã¸± °ÍÀÌ´Ù. OpenGLµµ ¹è¿­·Î Á¤Á¡ÀÇ ÁýÇÕÀ» Á¤ÀÇÇÏ´Â ¹æ¹ýÀ» °ø½ÄÀûÀ¸·Î Áö¿øÇÑ´Ù. ¸ÕÀú ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¹è¿­À» »ç¿ëÇϵµ·Ï ¼³Á¤ÇÑ´Ù.

 

void glEnableClientState(GLenum cap);

void glEnableClientState(GLenum cap);

 

¹è¿­À» »ç¿ëÇÏ´Â °ÍÀº OpenGL ¼­¹öÀÎ ±×·¡ÇÈ Ä«µåÀÇ ¼³Á¤°ú´Â »ó°üÀÌ ¾ø°í ±×·¡ÇÈÀ» ±×¸®´Â Ŭ¶óÀ̾ðÆ®ÀÎ CPU¿Í »ó°üÀÌ ÀÖÀ¸¹Ç·Î glEnable ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù. ¾î¶»°Ô ±×¸± °ÍÀΰ¡ÀÇ ¹®Á¦°¡ ¾Æ´Ï°í ¾î¶»°Ô Á¤º¸¸¦ Àü´ÞÇÒ °ÍÀΰ¡ÀÇ ¹®Á¦À̹ǷΠ¹è¿­ »ç¿ë ¿©ºÎ´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¼³Á¤ÀÏ »ÓÀÌ´Ù. ±×·¡¼­ glEnable ÇÔ¼ö ´ë½Å glEnableClientState ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. Àμö·Î ¾î¶² ¹è¿­À» »ç¿ëÇÒ °ÍÀΰ¡¸¦ Àü´ÞÇÑ´Ù.

 

GL_COLOR_ARRAY

GL_EDGE_FLAG_ARRAY

GL_FOG_COORD_ARRAY

GL_INDEX_ARRAY

GL_NORMAL_ARRAY

GL_SECONDARY_COLOR_ARRAY

GL_TEXTURE_COORD_ARRAY

GL_VERTEX_ARRAY

 

Á¤Á¡»Ó¸¸ ¾Æ´Ï¶ó °¢ Á¤Á¡ÀÇ »ö»óÀ̳ª ¹ý¼± Á¤º¸, ÅؽºÃ³ ÁÂÇ¥ µîµµ ¹è¿­·Î Á¤ÀÇ °¡´ÉÇÏ´Ù. ÀÔü µµÇüÀ» ±¸¼ºÇϱâ À§ÇÑ ¸ðµç Á¤º¸µéÀ» ÇϳªÀÇ ¹è¿­¿¡ Áý¾àÇÒ ¼ö ÀÖ´Ù. ¹è¿­Àº µ¿ÀÏ Å¸ÀÔ º¯¼öÀÇ ÁýÇÕÀÏ »ÓÀ̹ǷΠÀϹÝÀûÀÎ C ±¸¹®À¸·Î ÀÛ¼ºÇÑ´Ù. Á¤Á¡ ¹è¿­ÀÇ °æ¿ì GLfloat ŸÀÔÀÇ ÀÏÂ÷¿ø ¹è¿­À» ¼±¾ðÇÏ°í ¹è¿­À» ±¸¼ºÇÏ´Â x, y³ª x,y,z ÁÂÇ¥¸¦ Á× ³ª¿­ÇÏ¸é µÈ´Ù.

 

GLfloat vert[] = { x1, y1, z1, x2, y2, z2, .... };

 

¹è¿­ ¿ä¼Ò´Â ÇÊ¿äÇѸ¸Å­ ¾ó¸¶µçÁö ³ª¿­ÇÒ ¼ö ÀÖ´Ù. ¹Ì¸® Á¤ÀÇÇØ ³õÀº ÀÌÁø µ¥ÀÌÅ͸¦ ÆÄÀÏÀ̳ª ³×Æ®¿öÅ©·Î ÀоîµéÀÏ ¼öµµ ÀÖ°í ÇÊ¿äÇÒ °æ¿ì ÀϺθ¦ ¾à°£ º¯ÇüÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. ´ÙÀ½ ÇÔ¼ö´ÂÀÌ ¹è¿­ÀÇ À§Ä¡¿Í ±¸Á¶¸¦ ¾Ë·Á ÁØ´Ù. ´ëÇ¥ÀûÀ¸·Î Á¤Á¡ ¹è¿­ÀÇ °æ¿ì¸¸ º¸ÀÚ.

 

void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);

 

size´Â ÇÑ ÁÂÇ¥¸¦ ±¸¼ºÇÏ´Â ¿ä¼ÒÀÇ °³¼öÀÌ´Ù. x, y µÎ°³·Î ±¸¼ºµÈ ÁÂÇ¥À̸é 2¸¦ ÁöÁ¤ÇÏ°í x, y, z ¼¼ °³·Î ±¸¼ºµÈ ÁÂÇ¥À̸é 3À» ÁöÁ¤ÇÑ´Ù. ¹è¿­ ÀÚü°¡ ÀÏÂ÷¿øÀ̹ǷΠÇÑ Á¤Á¡À» ÀÌ·ç´Â ÁÂÇ¥°¡ ¸î °³¾¿ ÇÑ ½ÖÀÎÁö¸¦ ¹àÈ÷´Â °ÍÀÌ´Ù. typeÀº ¹è¿­ ¿ä¼ÒÀÇ Å¸ÀÔÀÌ´Ù. Á¤¼ö ÁÂÇ¥À̸é GL_INT, ½Ç¼ö ÁÂÇ¥À̸é GL_FLOAT µî°ú °°ÀÌ Å¸ÀÔÀ» ¹àÈù´Ù. ÀÌ µÎ Àμö´Â Á¤Á¡À» Á¤ÀÇÇÒ ¶§ glVertex2i¸¦ È£ÃâÇÒ °ÍÀÎÁö glVertext3f¸¦ È£ÃâÇÒ °ÍÀÎÁö¸¦ °áÁ¤ÇÑ´Ù.

stride´Â ¹è¿­ ¿ä¼Ò°£ÀÇ °£°ÝÀ» ÁöÁ¤Çϴµ¥ ¸ðµç ¿ä¼Ò¸¦ ¿¬ÀÌ¾î ¹èÄ¡ÇÏ´Â °ÍÀÌ º¸ÅëÀ̹ǷΠÀÌ °ªÀº ´ë°³ÀÇ °æ¿ì 0ÀÌ´Ù. ÀÌ Àμö°¡ ¾î¶»°Ô È°¿ëµÇ´ÂÁö´Â Àá½Ã ÈÄ ½Ç½ÀÇØ º¼ °ÍÀÌ´Ù. ¸¶Áö¸· Àμö pointer´Â ¹è¿­ÀÌ Á¤ÀÇµÈ ½ÇÁ¦ ÁÖ¼ÒÀÌ´Ù. ÀÌ ÇÔ¼ö È£Ãâ¿¡ ÀÇÇØ OpenGLÀº Á¤Á¡ µ¥ÀÌÅÍ°¡ ¾î´À ¹è¿­¿¡ ¾î¶² ±¸Á¶·Î ÀúÀåµÇ¾î ÀÖ´ÂÁö¸¦ ¾Ë°Ô µÈ´Ù. »ö»ó ¹è¿­À̳ª ¹ý¼± ¹è¿­µµ ±¸Á¶´Â °ÅÀÇ µ¿ÀÏÇÏ´Ù.

 

void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);

void glNormalPointer(GLenum type, GLsizei stride, const GLvoid * pointer);

 

´Ù¸¸ Á¤º¸ÀÇ ¼º°Ý»ó ¾à°£¾¿ ´Þ¶óÁö´Â ºÎºÐÀÌ Àִµ¥ »ö»óÀº rgb, rgba µîÀ¸·Î ±¸¼ºµÉ ¼ö ÀÖÀ¸¹Ç·Î size Àμö°¡ ÀÖ´Ù. ´Ü, sizeÀÇ °¡´ÉÇÑ °ªÀº 3 ¶Ç´Â 4»ÓÀ̶ó´Â Á¡¿¡¼­ Á¤Á¡ ¹è¿­°ú´Â ´Ù¸£´Ù. ¹ý¼±Àº ¹«Á¶°Ç xyz ¼¼ °³¾¿ ÇÑ ½ÖÀ̹ǷΠsize Á¤º¸´Â ºÒÇÊ¿äÇÏ´Ù. ¹è¿­À» Á¤ÀÇÇÑ ÈÄ ´ÙÀ½ ÇÔ¼ö·Î ¹è¿­ ¿ä¼Ò¸¦ Çϳª¾¿ ²¨³½´Ù.

 

void glArrayElement(GLint i);

 

ÀÌ ÇÔ¼ö´Â ¹è¿­¿¡¼­ i ¹ø° Á¤Á¡ ÁÂÇ¥¸¦ ²¨³» ÇØ´ç Á¤º¸¸¦ ¼­¹ö·Î Àü´ÞÇÑ´Ù. size¿Í type Á¤º¸¸¦ ¹ÙÅÁÀ¸·Î Çѹø¿¡ ¸î °³¾¿ ²¨³¾ °ÍÀΰ¡¸¦ °áÁ¤ÇÒ ¼ö ÀÖ´Ù. Á¤Á¡ ¹è¿­À̶ó¸é glVertex ÇÔ¼ö¸¦ È£ÃâÇÏ°í »ö»ó ¹è¿­À̶ó¸é glColor¸¦ È£ÃâÇÒ °ÍÀÌ´Ù. ¹è¿­·ÎºÎÅÍ Á¤Á¡À» Á¤ÀÇÇÒ °æ¿ì¿¡´Â glBegin°ú glEnd ºí·Ï¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù.

¹è¿­À» Á¤ÀÇÇÏ°í »ç¿ëÇÏ´Â ÀýÂ÷°¡ ´Ù¼Ò º¹ÀâÇÏ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¹è¿­À» »ç¿ëÇÏ´Â °¡Àå ±âº»ÀûÀÎ ÀýÂ÷¸¦ Àß º¸¿©ÁÖ¸ç ¶ÇÇÑ ¿©·¯ °¡Áö ´ëüÀûÀÎ ¹æ¹ýµµ ½ÇÇèÇØ º½À¸·Î½á Á¤Á¡ ¹è¿­ÀÌ ¿Ö ½Ç¿ëÀûÀÎÁö¸¦ ¼³¸íÇÑ´Ù. ÇǶó¹Ìµå¸¦ ±¸¼ºÇÏ´Â Á¤Á¡µéÀ» ¹è¿­·Î Á¤ÀÇÇØ µÎ°í ·çÇÁ¸¦ µ¹¸ç Á¤Á¡À» Á¤ÀÇÇÔÀ¸·Î½á ÀÔü µµÇüÀ» Çѹø¿¡ ±×¸°´Ù.

 

VertexArray

#include <windows.h>

#include <gl/glut.h>

#include <stdio.h>

 

void DoDisplay();

void DoKeyboard(unsigned char key, int x, int y);

GLfloat xAngle, yAngle, zAngle;

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

       ,LPSTR lpszCmdParam,int nCmdShow)

{

     glutCreateWindow("OpenGL");

     glutDisplayFunc(DoDisplay);

     glutKeyboardFunc(DoKeyboard);

     glutMainLoop();

     return 0;

}

 

void DoKeyboard(unsigned char key, int x, int y)

{

     switch(key) {

     case 'a':yAngle += 2;break;

     case 'd':yAngle -= 2;break;

     case 'w':xAngle += 2;break;

     case 's':xAngle -= 2;break;

     case 'q':zAngle += 2;break;

     case 'e':zAngle -= 2;break;

     case 'z':xAngle = yAngle = zAngle = 0.0;break;

     }

     char info[128];

     sprintf(info, "x=%.1f, y=%.1f, z=%.1f", xAngle, yAngle, zAngle);

     glutSetWindowTitle(info);

     glutPostRedisplay();

}

 

void DoDisplay()

{

     static GLfloat vert[] = {

          0, 0, -0.8,          // 12½Ã

          0.5, 0.5, 0,

          -0.5, 0.5, 0,

 

          0, 0, -0.8,          // 9½Ã

          -0.5, 0.5, 0,

          -0.5, -0.5, 0,

 

          0, 0, -0.8,          // 6½Ã

          -0.5, -0.5, 0,

          0.5, -0.5, 0,

 

          0, 0, -0.8,          // 3½Ã

          0.5, -0.5, 0,

          0.5, 0.5, 0,

     };

 

     glEnableClientState(GL_VERTEX_ARRAY);

     glVertexPointer(3, GL_FLOAT, 0, vert);

 

     glClear(GL_COLOR_BUFFER_BIT);

     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

 

     glMatrixMode(GL_MODELVIEW);

     glPushMatrix();

     glRotatef(xAngle, 1.0f, 0.0f, 0.0f);

     glRotatef(yAngle, 0.0f, 1.0f, 0.0f);

     glRotatef(zAngle, 0.0f, 0.0f, 1.0f);

 

     glRectf(-0.5, 0.5, 0.5, -0.5);

 

     glBegin(GL_TRIANGLES);

     for (int i=0;i<sizeof(vert)/sizeof(vert[0]);i+=3) {

          glVertex3f(vert[i], vert[i+1], vert[i+2]);

     }

     glEnd();

 

     glPopMatrix();

     glFlush();

}

 

vert ¹è¿­¿¡´Â ÇǶó¹Ìµå¸¦ ±¸¼ºÇÏ´Â °¢ »ï°¢ÇüÀÇ Á¤Á¡ ÁÂÇ¥µéÀ» ÀúÀåÇß´Ù. »ï°¢Çü Çϳª´ç 3°³¾¿ÀÇ Á¤Á¡ÀÌ ÇÊ¿äÇÏ°í °¢ Á¤Á¡´ç x, y, z ¼¼ ½Ö¾¿ ÁÂÇ¥°¡ ÇÊ¿äÇϹǷΠÃÑ Á¤Á¡ÀÇ °³¼ö´Â 12°³ÀÌ¸ç ¹è¿­ÀÇ Å©±â´Â 36ÀÌ´Ù. GL_TRIANGLE_FAN ¸ðµå¸¦ »ç¿ëÇϸé 5°³·Îµµ °¡´ÉÇÏÁö¸¸ À妽º¸¦ »ç¿ëÇÏ´Â ´õ ÁÁÀº ¹æ¹ýÀÌ ÀÖÀ¸¹Ç·Î ¿©±â¼­´Â ±×³É °¢ »ï°¢ÇüÀ» ±¸¼ºÇÏ´Â Á¤Á¡À» Áߺ¹ Á¤ÀÇÇß´Ù. ¸Å ÇÔ¼ö È£Ãâ½Ã¸¶´Ù ¹è¿­À» ÃʱâÈ­ÇÒ ÇÊ¿ä´Â ¾øÀ¸¹Ç·Î staticÀ¸·Î ¼±¾ðÇߴµ¥ ¾Æ¿¹ Àü¿ªÀ¸·Î ¼±¾ðÇصµ »ó°ü¾ø´Ù.

¹è¿­À» ¼±¾ðÇÑ ÈÄ Á¤Á¡ ¹è¿­ ±â´ÉÀ» »ç¿ëÇÏ°Ú´Ù°í ¼±¾ðÇÑ´Ù. ±×¸®°í glVertexPointer ÇÔ¼ö·Î vert ¹è¿­ÀÇ À§Ä¡¸¦ ¾Ë·Á Áִµ¥ GL_FLOAT ŸÀÔÀÇ º¯¼ö 3°³¾¿ ÇѽÖÀ» ÀÌ·ç¾î Á¤Á¡ Çϳª¿¡ ´ëÇÑ Á¤º¸ÀÓÀ» ¸í½ÃÇÑ´Ù. ¾ÆÁ÷ »ö»ó Á¤º¸°¡ ¾øÀ¸¹Ç·Î Æú¸®°ï ¸ðµå¸¦ GL_LINEÀ¸·Î ¼³Á¤ÇÏ¿© ¼±¸¸ ±×¸®µµ·Ï Çß´Ù.

ÀÏ´Ü glRectf ÇÔ¼ö·Î ¹Ø¸é »ç°¢ÇüÀ» ¸ÕÀú ±×¸°´Ù. »ç°¢ÇüÀº ¸ð¾çÀÌ ´Ù¸£¹Ç·Î º°µµ·Î ±×·È´Âµ¥ µÎ °³ÀÇ »ï°¢ÇüÀ¸·Î ºÐÇÒÇϸé ÀÌ ¿ª½Ã Á¤Á¡ ¹è¿­¿¡ Æ÷ÇÔ½Ãų ¼öµµ ÀÖ´Ù. ³ª¸ÓÁö »ï°¢ÇüÀº ·çÇÁ¸¦ µ¹¸ç ±×¸°´Ù. ¿¹Á¦ÀÇ ÄÚµå´Â ¾ÆÁÖ ¿ø·ÐÀûÀÌ´Ù. vert ¹è¿­ÀÇ ¼±µÎ¿¡¼­ ½ÃÀÛÇÏ¿© 3Ä­¾¿ °Ç³Ê¶Ù¸é¼­ i, i+1, i+2 ¹ø° ¿ä¼Ò¸¦ ²¨³»¸é ÀÌ °ªµéÀÌ °ð x, y, z ÁÂÇ¥°ªÀÌ´Ù. ÁÂÇ¥¸¦ ²¨³» glVertex ÇÔ¼ö·Î Â÷·Ê´ë·Î Àü´ÞÇÑ °ÍÀÌ´Ù. ÇǶó¹Ìµå°¡ Àß ±×·ÁÁú °ÍÀÌ´Ù.

Á¤Á¡µéÀÌ ¹è¿­¿¡ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ¹è¿­À» Àμö·Î ÃëÇÏ´Â glVertex ÇÔ¼ö¸¦ È£ÃâÇÒ ¼öµµ ÀÖ´Ù. 3Ä­¾¿ °Ç³Ê¶Ù¸é¼­ x ÁÂÇ¥°¡ ÀÖ´Â ¼±µÎ ¹øÁö¸¦ glVertex3fv ÇÔ¼ö·Î Àü´ÞÇÏ¸é ³ª¸ÓÁö y, z °ªÀº ¾Ë¾Æ¼­ ²¨³» ¾µ °ÍÀÌ´Ù. ´ÙÀ½ Äڵ嵵 °á°ú´Â µ¿ÀÏÇÏ´Ù.

 

glBegin(GL_TRIANGLES);

for (int i=0;i<sizeof(vert)/sizeof(vert[0]);i+=3) {

     glVertex3fv(&vert[i]);

}

glEnd();

 

ÀÌ»óÀÇ µÎ ÄÚµå´Â ¾îµð±îÁö³ª ¹è¿­¿¡ ÁÂÇ¥¸¦ ÀúÀåÇØ ³õ°í ¾µ ¼ö ÀÖ´Ù´Â °ÍÀ» º¸¿©ÁÖ´Â °Í »ÓÀÌ´Ù. ÁÂÇ¥°ªÀ» Àμö·Î Á÷Á¢ Àü´ÞÇÏÁö ¾ÊÀ» »Ó glVertex ÇÔ¼ö¸¦ ¸Å¹ø È£ÃâÇÏ´Â °Í°ú ¿ø·ÐÀûÀ¸·Î °°Àº ÄÚµåÀÌ´Ù. ÇÔ¼ö È£Ãâ Äڵ尡 ¹Ýº¹µÇÁö ¾ÊÀ¸¹Ç·Î ¸Þ¸ð¸®»óÀÇ ÀÌÁ¡Àº ÀÖÁö¸¸ ·çÇÁ ³»ºÎ¿¡¼­ ÇÔ¼ö¸¦ ¿©·¯ ¹ø È£ÃâÇϱâ´Â ¸Å ÇÑ°¡ÁöÀ̹ǷΠ¼Óµµ»óÀÇ ÀÌÁ¡Àº ¾ø´Ù. ÇÏÁö¸¸ Á¤Á¡ÀÌ ¹è¿­¿¡ ¸ð¿© ÀÖ¾î ¼öÁ¤Çϱâ ÆíÇÏ´Ù´Â ÀÌÁ¡Àº ÀÖ´Ù.

¿©±â±îÁöÀÇ º¯È­´Â C ¾ð¾î ¹®¹ý ¼öÁØ¿¡¼­ ÃæºÐÈ÷ ³³µæÀÌ µÉ °ÍÀÌ´Ù. ÀÌÁ¦ OpenGLÀÇ Á¤Á¡ ¹è¿­ ±â´ÉÀ» È°¿ëÇØ º¸ÀÚ. glBegin ~ glEnd ºÎºÐÀ» ´ÙÀ½ ÄÚµå·Î ´ëüÇÑ´Ù.

 

glBegin(GL_TRIANGLES);

for (int i=0;i<sizeof(vert)/sizeof(vert[0])/3;i++) {

     glArrayElement(i);

}

glEnd();

 

¹è¿­¿¡¼­ ÁÂÇ¥¸¦ Á÷Á¢ ²¨³¾ ÇÊ¿ä¾øÀÌ glArrayElement ÇÔ¼ö·Î Á¤Á¡ÀÇ ¼ø¼­°ª¸¸ Àü´ÞÇØ ÁÖ¸é µÈ´Ù. À̶§ glArrayElement ÇÔ¼öÀÇ Àμö´Â ¹è¿­ÀÇ Ã·ÀÚ°¡ ¾Æ´Ï¶ó Á¤Á¡ÀÇ ¼ø¼­°ªÀÓÀ» À¯ÀÇÇÏÀÚ. °¢ Á¤Á¡ÀÌ 3°³¾¿ÀÇ °ªÀ¸·Î ±¸¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ¹è¿­ Å©±âÀÇ 1/3¸¸Å­¸¸ ·çÇÁ¸¦ µ¹¸é µÈ´Ù. ¹è¿­À» È°¿ëÇÏ´Â ÃÖÁ¾ÀûÀÎ ÄÚµå´Â ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù.

 

void glDrawArrays(GLenum mode, GLint  first, GLsizei count);

 

ÀÌ ÇÔ¼ö´Â ¹è¿­ÀÇ Å©±â¸¸ ¾Ë·Á ÁÖ¸é ¾Ë¾Æ¼­ ·çÇÁ¸¦ µ¹°í glBegin, glEnd ºí·Ï±îÁöµµ ó¸®ÇØ ÁØ´Ù. mode Àμö´Â glBeginÀ¸·Î Àü´ÞÇÒ ±×¸®±â ¸ðµåÀ̸ç first´Â ¹è¿­ÀÇ Ã¹¹ø° ¿ä¼Ò¸¦ ÁöÁ¤Ç쵂 Åë»ó 0ÀÌ´Ù. count´Â ¹è¿­¿¡ ÀúÀåµÈ Á¤º¸ÀÇ °³¼öÀÌ´Ù. ÀÌ °æ¿ì Á¤Á¡ÀÌ 12°³À̹ǷΠ12·Î Àü´ÞÇÑ´Ù. ´ÙÀ½ µü ÇÑ ÁÙ·Î ÇǶó¹Ìµå¸¦ ±×¸± ¼ö ÀÖ´Ù.

 

glDrawArrays(GL_TRIANGLES, 0, sizeof(vert)/sizeof(vert[0])/3);

 

ÀÌ ÇÔ¼öÀÇ ³»ºÎ µ¿ÀÛÀº ¾Õ¿¡¼­ ÀÛ¼ºÇÑ Äڵ带 ¿ªÀ¸·Î À¯ÃßÇØ º¸¸é ½±°Ô ÁüÀÛÇÒ ¼ö ÀÖ´Ù. glBeginÀ¸·Î ±×¸®±â ºí·ÏÀ» ½ÃÀÛÇÏ°í ¹è¿­À» ¼øȸÇϸ鼭 °¢ Á¤Á¡ ÁÂÇ¥¸¦ ²¨³» glVertex ÇÔ¼ö¸¦ ¼ø¼­´ë·Î È£ÃâÇÒ °ÍÀÌ´Ù. µü ÇϳªÀÇ ÇÔ¼ö È£Ã⸸À¸·Î ±×¸®±â¸¦ ¼öÇàÇϹǷΠ¸Þ¸ð¸®¸¦ ÈξÀ ´ú Â÷ÁöÇÏ°í ¼Óµµµµ ¿ùµîÈ÷ ºü¸£´Ù.

7-2.¹è¿­ À妽º

¾Õ ¿¹Á¦´Â ¹è¿­À» Á¤Á¡¿¡ Á¤ÀÇÇÔÀ¸·Î½á Äڵ尡 ÈξÀ ´õ ª¾ÆÁ³°í ¼Óµµµµ »¡¶óÁ³´Ù. ±×·¯³ª ¾ÆÁ÷ »ö»óµµ ÀÔÈ÷Áö ¸øÇß°í °°Àº Á¤Á¡ÀÌ ¿©·¯ ¹ø Áߺ¹µÇ¾î ÀÖ¾î ¹º°¡ Çã¼úÇØ º¸ÀδÙ. ¹°·Ð ¹®Á¦Á¡À» ÇØ°áÇÒ ¼ö ÀÖ´Â ¸íÄèÇÑ ¹æ¹ýµéÀÌ Á¦°øµÈ´Ù. ÇǶó¹Ìµå¸¦ ±¸¼ºÇÏ´Â »ï°¢ÇüµéÀº Á¤Á¡µéÀ» °øÀ¯Çϴµ¥ ÀÌ Á¤Á¡µéÀ» Çϳª·Î ÇÕÃļ­ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÇǶó¹Ìµå´Â ´ÙÀ½ ´Ù¼¸ °³ÀÇ Á¤Á¡À¸·Î ±¸¼ºµÈ´Ù.

°¢ Á¤Á¡µéÀ» ¹è¿­¿¡ Çѹø¾¿¸¸ ³ª¿­ÇØ ³õ°í µµÇüÀº ¾î´À Á¤Á¤µé·Î ±¸¼ºµÇ´ÂÁö À妽º¸¸ ¹àÈûÀ¸·Î½á Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î 12½Ã »ï°¢ÇüÀº 0, 1, 2¹ø Á¤Á¡À¸·Î ±¸¼ºµÇ°í 9½Ã »ï°¢ÇüÀº 0, 2, 3¹ø Á¤Á¡À¸·Î ±¸¼ºµÈ´Ù. Á¤Á¡µéÀº °¢ µµÇüÀÇ Á¢Á¡¿¡ ÀÖÀ¸¹Ç·Î Áߺ¹Àº ¾îÂîÇÒ µµ¸®°¡ ¾ø´Ù. ±×·¯³ª ÁÂÇ¥´Â 3°³ÀÇ ½Ç¼ö·Î ±¸¼ºµÇ´Âµ¥ ºñÇØ Ã·ÀÚ´Â °íÀÛ Á¤¼ö 1¹ÙÀÌÆ®¹Û¿¡ ¾ÈµÇ¹Ç·Î Áߺ¹¿¡ ÀÇÇÑ ºÎÀÛ¿ëÀÌ ÈξÀ ´úÇÏ´Ù. Á¤Á¡ÀÇ À妽º ¹è¿­À» Á¤ÀÇÇÑ ÈÄ ´ÙÀ½ ÇÔ¼ö·Î µµÇüÀ» ±×¸°´Ù.

 

void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);

 

±×¸®±â ¸ðµå¿Í ¹è¿­ÀÇ Å©±â, À妽º ¹è¿­ÀÇ ¿ä¼Ò ŸÀÔ ±×¸®°í À妽º ¹è¿­À» Àü´ÞÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ¹è¿­¿¡¼­ À妽º¸¦ ²¨³»°í À妽º°¡ °¡¸®Å°´Â ¼ø¼­°ª·ÎºÎÅÍ Á¤Á¡ÀÇ ÁÂÇ¥¸¦ ã¾Æ µµÇüÀ» ±×¸°´Ù.

 

VertexArrayIndex

void DoDisplay()

{

     static GLfloat vert[] = {

          0, 0, -0.8,          // Áß¾Ó

          0.5, 0.5, 0,         // ¿ì»ó

          -0.5, 0.5, 0,        // Á»ó

          -0.5, -0.5, 0,      // ÁÂÇÏ

          0.5, -0.5, 0,        // ¿ìÇÏ

     };

 

     static GLubyte index[] = {

          0, 1, 2,              //12½Ã

          0, 2, 3,              // 9½Ã

          0, 3, 4,              // 6½Ã

          0, 4, 1,              // 3½Ã

     };

 

     glClear(GL_COLOR_BUFFER_BIT);

     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

 

     glMatrixMode(GL_MODELVIEW);

     glPushMatrix();

     glRotatef(xAngle, 1.0f, 0.0f, 0.0f);

     glRotatef(yAngle, 0.0f, 1.0f, 0.0f);

     glRotatef(zAngle, 0.0f, 0.0f, 1.0f);

 

     glRectf(-0.5, 0.5, 0.5, -0.5);

 

     glEnableClientState(GL_VERTEX_ARRAY);

     glVertexPointer(3, GL_FLOAT, 0, vert);

 

     glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_BYTE, index);

 

     glPopMatrix();

     glFlush();

}

 

½ÇÇà °á°ú´Â ¾Õ ¿¹Á¦¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. ±×·¯³ª Áߺ¹µÇ´Â Á¤Á¡À» Çѹø¸¸ ±â·ÏÇÔÀ¸·Î½á °³¼ö°¡ 5°³·Î ÁÙ¾î µé¾ú´Ù. ´ë½Å ÀÌ Á¤Á¡µéÀÌ ¾î¶»°Ô Á¶ÇÕµÇ¾î »ï°¢ÇüÀ» ±¸¼ºÇÏ´ÂÁö À妽º ¹è¿­ÀÌ Ãß°¡µÇ¾ú´Ù. ´çÀåÀº Å« À̵æÀÌ ¾ø´Â °Í °°Áö¸¸ ÁÂÇ¥ ¿Ü¿¡ »ö»óÀ̳ª ÅؽºÆ® ÁÂÇ¥ µîÀÇ Á¤º¸°¡ ´õ µé¾î°¡¸é À妽º¸¦ ¾²´Â °ÍÀÌ ÈξÀ ´õ À¯¸®ÇÏ´Ù.

7-3.»ö»ó ¹è¿­

´ÙÀ½Àº »ö»ó ¹è¿­µµ Àû¿ëÇÏ¿© °¢ ¸é¿¡ »ö»óÀ» ÀÔÇô º¸ÀÚ. Á¤Á¡ ¹è¿­°ú »ç¿ëÇÏ´Â ¹æ¹ýÀ̳ª ±¸¼º ¿ø¸®´Â °ÅÀÇ ºñ½ÁÇÏ´Ù. °¢ Á¤Á¡¿¡ ÇØ´çÇÏ´Â »ö»óÀ» ¹è¿­·Î Á¤ÀÇÇØ µÎ°í À§Ä¡¸¦ °¡¸£ÃÄ ÁØ´Ù. ¸éÀ» ä¿ï °ÍÀ̹ǷΠÆú¸®°ï ¸ðµå´Â ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ¾øµÇ ´ë½Å ¸é³¢¸® ÀüÈÄ °ü°è¸¦ Ç¥ÇöÇϱâ À§ÇØ ±íÀÌ Å×½ºÆ®´Â ÇØ¾ß ÇÑ´Ù.

 

void DoDisplay()

{

     static GLfloat vert[] = {

          0, 0, -0.8,          // Áß¾Ó

          0.5, 0.5, 0,         // ¿ì»ó

          -0.5, 0.5, 0,        // Á»ó

          -0.5, -0.5, 0,      // ÁÂÇÏ

          0.5, -0.5, 0,        // ¿ìÇÏ

     };

 

     static GLfloat color[] = {

          1,1,1,                // Áß¾Ó

          0,0,1,                // ¿ì»ó

          1,0,0,                // Á»ó

          1,1,0,                // ÁÂÇÏ

          0,1,0,                // ¿ìÇÏ

     };

 

     static GLubyte index[] = {

          0, 1, 2,              //12½Ã

          0, 2, 3,              // 9½Ã

          0, 3, 4,              // 6½Ã

          0, 4, 1,              // 3½Ã

     };

 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

     glEnable(GL_DEPTH_TEST);

     glShadeModel(GL_FLAT);

 

     glMatrixMode(GL_MODELVIEW);

     glPushMatrix();

     glRotatef(xAngle, 1.0f, 0.0f, 0.0f);

     glRotatef(yAngle, 0.0f, 1.0f, 0.0f);

     glRotatef(zAngle, 0.0f, 0.0f, 1.0f);

 

     glColor3f(1,1,1);

     glRectf(-0.5, 0.5, 0.5, -0.5);

 

     glEnableClientState(GL_VERTEX_ARRAY);

     glVertexPointer(3, GL_FLOAT, 0, vert);

     glEnableClientState(GL_COLOR_ARRAY);

     glColorPointer(3, GL_FLOAT, 0, color);

 

     glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_BYTE, index);

 

     glPopMatrix();

     glFlush();

}

 

color ¹è¿­¿¡ °¢ Á¤Á¡¿¡ ´ëÀÀµÇ´Â »ö»óÀ» ÁöÁ¤Ç쵂 Á¤Á¡ ¹è¿­°ú ÀÏ´ëÀÏ·Î ´ëÀÀµÇ¹Ç·Î ¼ø¼­¸¦ µ¿ÀÏÇÏ°Ô À¯ÁöÇØ¾ß ÇÑ´Ù. GL_COLOR_ARRAY ±â´ÉÀ» ÄÑ°í glColorPointer ÇÔ¼ö·Î »ö»ó ¹è¿­ÀÇ À§Ä¡¿Í ±¸Á¶¸¦ ¾Ë·Á ÁÖ¾ú´Ù. ±×¸®´Â ÇÔ¼ö´Â ¶È°°ÀÌ glDrawElementsÀÌ´Ù. ÀÌ ÇÔ¼ö´Â À妽º ¹è¿­·ÎºÎÅÍ °¢ Á¤Á¡ÀÇ ÁÂÇ¥¸¦ ²¨³»¸é¼­ µ¿½Ã¿¡ °¢ »ö»óÀÇ ÁÂÇ¥µµ ²¨³» Á¤Á¡¿¡ Àû¿ëÇÑ´Ù.

½ÇÇà °á°ú´Â ¾ÖÃÊ¿¡ ¸¸µé¾ú´ø ÇǶó¹Ìµå ¿¹Á¦¿Í µ¿ÀÏÇÏ´Ù. Á¤Á¡ ¹è¿­°ú »ö»ó ¹è¿­Àº ÇϳªÀÇ Á¤Á¡¿¡ ´ëÇÑ Á¤º¸ÀÌµÇ Çϳª´Â ÁÂÇ¥ÀÌ°í Çϳª´Â »ö»óÀ̾ µÎ °³ÀÇ ¹è¿­·Î µû·Î ³ª´©¾î ÀúÀåÇß´Ù. ¿ä¼ÒÀÇ Å¸ÀÔ¸¸ ÀÏÄ¡ÇÑ´Ù¸é ÀÌ µÎ ¹è¿­À» Çϳª·Î ÇÕÄ¥ ¼öµµ ÀÖ´Ù. À̶§ »ç¿ëµÇ´Â Àμö°¡ strideÀÌ´Ù. °°Àº ¹è¿­¿¡ ¼ø¼­´ë·Î Á¤ÀÇÇØ ³õ¾Æµµ stride Àμö·Î °Ç³Ê¶Û ¹ÙÀÌÆ® ¼ö¸¦ ÁöÁ¤ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

 

void DoDisplay()

{

     static GLfloat vertcolor[] = {

          1,1,1,  0, 0, -0.8,          // Áß¾Ó

          0,0,1,  0.5, 0.5, 0,    // ¿ì»ó

          1,0,0,  -0.5, 0.5, 0,   // Á»ó

          1,1,0,  -0.5, -0.5, 0,  // ÁÂÇÏ

          0,1,0,  0.5, -0.5, 0,   // ¿ìÇÏ

     };

 

     static GLubyte index[] = {

          0, 1, 2,              //12½Ã

          0, 2, 3,              // 9½Ã

          0, 3, 4,              // 6½Ã

          0, 4, 1,              // 3½Ã

     };

 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

     glEnable(GL_DEPTH_TEST);

     glShadeModel(GL_FLAT);

 

     glMatrixMode(GL_MODELVIEW);

     glPushMatrix();

     glRotatef(xAngle, 1.0f, 0.0f, 0.0f);

     glRotatef(yAngle, 0.0f, 1.0f, 0.0f);

     glRotatef(zAngle, 0.0f, 0.0f, 1.0f);

 

     glColor3f(1,1,1);

     glRectf(-0.5, 0.5, 0.5, -0.5);

 

     glEnableClientState(GL_VERTEX_ARRAY);

     glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*6, &vertcolor[3]);

     glEnableClientState(GL_COLOR_ARRAY);

     glColorPointer(3, GL_FLOAT, sizeof(GLfloat)*6, vertcolor);

 

     glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_BYTE, index);

 

     glPopMatrix();

     glFlush();

}

 

vertcolor ¹è¿­Àº Á¤Á¡ÀÇ ÁÂÇ¥¿Í »ö»óÀ» °°ÀÌ ÀúÀåÇÑ´Ù. ¹è¿­ÀÇ 0,1,2 ¹ø° ¿ä¼Ò´Â »ö»ó°ªÀÌ°í 3,4,5¹ø° ¿ä¼Ò´Â Á¤Á¡ÀÇ ÁÂÇ¥°ªÀÌ¸ç µÎ °ªÀÌ ¹ø°¥¾Æ ³ªÅ¸³­´Ù. Á¤Á¡ ¹è¿­ÀÇ ½ÃÀÛ À§Ä¡¸¦ 3¹ø° ¿ä¼ÒÀÇ ¹øÁö¿¡ ¸ÂÃß¾î µÎ°í 6Ä­¾¿ °Ç³Ê¶Ùµµ·Ï ÁöÁ¤ÇÏ¸é ¼ø¼­´ë·Î ²¨³»¼­ »ç¿ëÇÒ °ÍÀÌ´Ù. glVertexPointer ÇÔ¼öÀÇ ÀμöµéÀÌ ÀÌ·± Á¤º¸¸¦ Á¦°øÇÑ´Ù. ¹è¿­ÀÇ ½ÃÀÛÀ§Ä¡´Â &vertcolor[3]À̸ç stride´Â GLfloat ¿ä¼Ò 6°³ºÐÀ̶ó´Â °ÍÀ» ¾Ë·ÁÁÖ°í ÀÖ´Ù.

¸¶Âù°¡Áö·Î »ö»ó ¹è¿­Àº ¼±µÎ¿¡¼­ ½ÃÀÛÇ쵂 ¸¶Âù°¡Áö·Î 6Ä­¾¿ °Ç³Ê¶Ùµµ·Ï Çß´Ù. stride´Â µ¿ÀÏÇÏ¸ç ¹è¿­ÀÇ ½ÃÀÛ ¹øÁö´Â vertcolorÀÌ´Ù. ÀÌ ¹øÁö´Â °ð ù¹ø° ¿ä¼ÒÀÇ ¹øÁöÀÎ &vertcolor[0]¿Í °°À¸¸ç ¹è¿­ÀÇ ¼±µÎ ¹øÁöÀÌ´Ù. µÎ Á¤º¸´Â ÇÑ ¹è¿­¿¡ ´ÙÀ½°ú °°ÀÌ ¿À¼Õ µµ¼Õ ¼¯¿© ÀÖ´Ù.

µÎ Á¤º¸¸¦ ÇÑ ¹è¿­¿¡ ¼¯¾î¼­ ÀúÀåÇ쵂 °¢ Á¤º¸ÀÇ Å©±â°¡ ÀÏÁ¤ÇϹǷΠũ±â¸¸Å­¾¿ °Ç³Ê¶Ù¸é¼­ ÀÐÀ¸¸é ¿øÇÏ´Â Á¤º¸¸¸ Á¤È®ÇÏ°Ô »©³» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÇÑ ¹è¿­¿¡ µÎ Á¤º¸°¡ ¸ð¿© ÀÖ¾î Çã¹ú³ª°Ô Çò°¥¸®´Â ¸ð¾ç»õÁö¸¸ ±×°Ç ÄÄÇ»ÅÍ°¡ ¾Ë¾Æ¼­ ÇÒ ÀÏÀ̹ǷΠ°ÆÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ¼Ò½º¿¡¼­´Â ÇÑ Çà¿¡ ÇÑ Á¤Á¡ÀÇ Á¤º¸¸¦ ±â·ÏÇÏ´Â ½ÄÀ¸·Î Á¤¸®ÇÏ°í ÅÇÀ¸·Î ¶ç¾î¾²±â¸¸ ÀßÇÏ¸é ¿ÞÂÊÀº »ö»ó, ¿À¸¥ÂÊÀº ÁÂÇ¥À̹ǷΠ»ç¶÷Àº ¿ÀÈ÷·Á ´õ Æí¸®ÇÏ´Ù.

ÁÂÇ¥¿Í »ö»ó »Ó¸¸ ¾Æ´Ï¶ó ¹ý¼±À̳ª ÅؽºÃ³ ÁÂÇ¥ µîµµ µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î ÇÑ ¹è¿­¿¡ ÀúÀåÇÒ ¼ö ÀÖ´Ù. ¿©·¯ ¹è¿­·Î ³ª´©¾î ÀúÀåÇÏ´Â °Íº¸´Ù ÇÑ ¹è¿­¿¡ ¼¯¾î¼­ ÀúÀåÇ쵂 ÁÖ±âÀûÀÎ °Å¸®¸¸Å­¸¸ Àß ¹èÄ¡ÇÏ¸é ³í¸®ÀûÀ¸·Î ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. ÀÌ ¹æ¹ýÀ» Á» ´õ °ø½ÄÈ­ÇÑ °ÍÀ» ÀÎÅ͸®ºê ¹è¿­À̶ó°í ÇÑ´Ù. ¸» ±×´ë·Î À̳ð Àú³ð ¸· ¼¯¿© ÀÖ°í °Ç³Ê ¶Ù¾î °¡¸ç Àд ¹è¿­À̶ó´Â ¶æÀÌ´Ù.

 

void glInterleavedArrays(GLenum format, GLsizei stride, const GLvoid * pointer);

 

formatÀº ¹è¿­¿¡ ¾î¶² Á¤º¸°¡ °°ÀÌ µé¾î ÀÖ´ÂÁö¸¦ ÁöÁ¤ÇÑ´Ù. ·¹ÆÛ·±½º¸¦ º¸¸é ¿©·¯ °¡Áö °¡´ÉÇÑ Á¶Çյ鿡 ´ëÇØ »ó¼ö°¡ Á¤ÀǵǾî ÀÖ´Ù. ´ëÇ¥ÀûÀÎ ¸î °¡Áö¸¸ ¼Ò°³ÇÏÀÚ¸é ´ÙÀ½°ú °°´Ù.

 

GL_C3F_V3F : »ö»ó°ª 3°³, ÁÂÇ¥°ª 3°³°¡ ±³´ë·Î µé¾î ÀÖ´Ù

GL_C4F_N3F_V3F : »ö»ó°ª 4°³, ¹ý¼± 3°³, ÁÂÇ¥°ª 3°³°¡ ±³´ë·Î µé¾î ÀÖ´Ù.

GL_T2F_C4F_N3F_V3F : ÅؽºÃ³, »ö»ó, ¹ý¼±, ÁÂÇ¥°ªÀÌ µé¾î ÀÖ´Ù.

 

ÇØ´ç Á¤º¸ ¹è¿­Àº ÀÚµ¿À¸·Î È°¼ºÈ­µÇ¹Ç·Î glEnableClientState ÇÔ¼ö´Â È£ÃâÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. stride´Â ÀÎÅ͸®ºê ¹è¿­ÀÇ °Ç³Ê¶Û °Å¸®Àε¥ ÀÌ Àμö¸¦ È°¿ëÇÏ¸é ±× ¿ÜÀÇ Ãß°¡ Á¤º¸µµ ´õ ³ÖÀ» ¼ö ÀÖ´Ù. pointer´Â ¹°·Ð ÀÎÅ͸®ºê ¹è¿­ÀÇ ¼±µÎ À§Ä¡ÀÌ´Ù. À§ ¿¹Á¦¿¡¼­´Â »ö»ó ¹è¿­°ú ÁÂÇ¥ ¹è¿­À» È°¿ëÇϱâ À§ÇØ ´ÙÀ½ 4ÁÙÀÇ ÇÔ¼ö¸¦ È£ÃâÇß´Ù.

 

glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*6, &vertcolor[3]);

glEnableClientState(GL_COLOR_ARRAY);

glColorPointer(3, GL_FLOAT, sizeof(GLfloat)*6, vertcolor);

 

°¢ ¹è¿­À» »ç¿ëÇÏ°Ú´Ù´Â ÀÇ»ç Ç¥½Ã¸¦ ÇÏ°í ¶Ç °¢ ¹è¿­¿¡ ´ëÇÑ ¸ð¾ç°ú À§Ä¡¸¦ °¡¸£ÃÄ ÁÖ¾î¾ß ÇÑ´Ù. ÀÎÅ͸®ºê ¹è¿­À» »ç¿ëÇÏ¸é ´ÙÀ½ ÇÑÁÙ·Î °£´ÜÇÏ°Ô ÀÌ È£ÃâÀ» ´ë½ÅÇÒ ¼ö ÀÖ´Ù.

 

glInterleavedArrays(GL_C3F_V3F, 0, vertcolor);

 

»ö»ó°ª 3°³, ÁÂÇ¥°ª 3°³°¡ ±³´ë·Î µé¾î ÀÖ´Ù´Â ¶æÀÌ´Ù. ÀÌ ¼±¾ðÀ» ÇÑ ÈÄ glDrawElements ÇÔ¼ö¸¦ È£ÃâÇϸé ÀÎÅ͸®ºê ¹è¿­¿¡¼­ ÇÊ¿äÇÑ °ªÀ» ¾Ë¾Æ¼­ ²¨³» »ç¿ëÇÒ °ÍÀÌ´Ù. ¼Ò½º°¡ ÈξÀ ´õ ª¾ÆÁö°í ¹è¿­À» °ü¸®Çϱ⵵ ´õ ¼ö¿ùÇÏ´Ù.

7-4.Ãâ·Â ¸ñ·Ï

glBegin°ú glEnd ºí·Ï¿¡¼­ ±×¸®±â ¸í·ÉÀ» Á÷Á¢ ½ÇÇàÇÏ´Â °ÍÀ» Áï½Ã ¸ðµå(immediate mode)¶ó°í ÇÑ´Ù. ÀÌ ºí·Ï¿¡ Æ÷ÇÔµÈ ¸í·ÉÀº ¼­¹ö·Î Áï½Ã Àü¼ÛµÇ¾î ¹Ù·Î ½ÇÇàµÈ´Ù. ÀÌ¿¡ ºñÇØ Ãâ·Â ¸ñ·Ï(display list)Àº ±×¸®±â ¸í·ÉÀÇ ÁýÇÕÀ» ÀÏ´Ü Á¤ÀÇÇÑ ÈÄ ÇѲ¨¹ø¿¡ ½ÇÇàÇÏ´Â ¹æ¹ýÀÌ´Ù. ¹Ì¸® ÄÄÆÄÀÏÇØ ³õÀ½À¸·Î½á Ãâ·Â ¼Óµµ°¡ Çâ»óµÇ°í µ¿ÀÏÇÑ ¸í·ÉÀ» ¿©·¯ ¹ø ¹Ýº¹ÇÒ ¶§ À¯¸®ÇÏ´Ù.

¹Ýº¹À» ÃÖ¼ÒÈ­ÇÏ°í Àç»ç¿ë¼ºÀ» ³ôÀδٴ ¸é¿¡¼­ ÇÁ·Î±×·¡¹Ö¿¡¼­ ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â °Í°ú À¯»çÇÏ´Ù. Ãâ·Â ¸ñ·ÏÀº À̸§ ´ë½Å Á¤¼ö ID·Î ±¸ºÐÇÑ´Ù. ¾Æ¹« Á¤¼ö³ª ¾µ ¼ö ¾ø°í Ãâ·Â ¸ñ·Ï³¢¸® ±¸ºÐµÇ¾î¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö·Î Ãâ·Â ¸ñ·ÏÀÇ ID¸¦ »ý¼ºÇÑ´Ù.

 

GLuint glGenLists(GLsizei range);

 

ÇÊ¿äÇÑ °³¼ö¸¦ Àü´ÞÇϸé ÀÌ °³¼ö¸¸Å­ ºó ¿µ¿ªÀ» ã¾Æ ½ÃÀÛ ID¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ID ÀÌÈÄ range -1¹ø±îÁöÀÇ ID¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Çϳª¸¸ ÇÊ¿äÇÏ´Ù¸é glGenLists(1)À» È£ÃâÇÏ¿© ¸®ÅÏµÈ °ªÀ» ¹Ù·Î »ç¿ëÇÏ¸é µÈ´Ù. µÎ °³°¡ ÇÊ¿äÇÏ´Ù¸é glGenLists(2)À» È£ÃâÇÏ°í ¸®ÅÏ°ªÀ» dl º¯¼ö·Î ¹ÞÀº ÈÄ dl°ú dl + 1À» »ç¿ëÇÏ¸é µÈ´Ù. Ãâ·Â ¸ñ·ÏÀ» ½ÃÀÛÇÒ ¶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void glNewList(GLuint list, GLenum mode);

 

list´Â Ãâ·Â¸ñ·ÏÀÇ À̸§ÀÌ´Ù. mode´Â Ãâ·Â ¸ñ·ÏÀ» ÀÛ¼º¸¸ ÇÒ °ÍÀÎÁö(GL_COMPILE) ¾Æ´Ï¸é ÀÛ¼º°ú µ¿½Ã¿¡ ½ÇÇàÇÒ °ÍÀÎÁö(GL_COMPILE_AND_EXECUTE)¸¦ ÁöÁ¤ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â Ãâ·Â ¸ñ·Ï ÀÛ¼ºÀ» Á¾·áÇÑ´Ù.

 

void glEndList(void);

 

glNewList¿Í glEndList »çÀÌÀÇ ¸í·ÉµéÀÌ Ãâ·Â ¸ñ·Ï¿¡ µî·ÏµÈ´Ù. ½ÇÇàÇÒ ¶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ½ÇÇàÇÒ Ãâ·Â¸ñ·ÏÀÇ ID¸¦ Àü´ÞÇÑ´Ù.

 

void glCallList(GLuint list);

 

À̶§ ¸ñ·Ï¿¡ ÀúÀåµÈ ±×¸®±â ¸í·ÉÀÌ ½ÇÇàµÈ´Ù. ´ÙÀ½ ¿¹Á¦´Â »ï°¢ÇüÀ» ±×¸®´Â ¸í·ÉÀ» Ãâ·Â ¸ñ·Ï¿¡ ÀúÀåÇØ µÎ°í 3¹ø È£ÃâÇÑ´Ù.

 

DisplayList

#include <windows.h>

#include <gl/glut.h>

 

void DoDisplay();

int dl;

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

       ,LPSTR lpszCmdParam,int nCmdShow)

{

     glutCreateWindow("OpenGL");

 

     dl = glGenLists(1);

     glNewList(dl, GL_COMPILE);

     glBegin(GL_TRIANGLES);

     glVertex2f(0.0, 0.2);

     glVertex2f(-0.2, -0.2);

     glVertex2f(0.2, -0.2);

     glEnd();

     glEndList();

 

     glutDisplayFunc(DoDisplay);

     glutMainLoop();

     return 0;

}

 

void DoDisplay()

{

     glClear(GL_COLOR_BUFFER_BIT);

    

     glColor3f(1,0,0);

     glCallList(dl);

    

     glTranslatef(0.2, 0.0, 0.0);

     glColor3f(0,1,0);

     glCallList(dl);

 

     glTranslatef(0.2, 0.0, 0.0);

     glColor3f(0,0,1);

     glCallList(dl);

 

     glFlush();

}

 

¸ÞÀÎ ÇÔ¼ö¿¡¼­ Ãâ·Â ¸ñ·ÏÀ» ¹Ì¸® ÀÛ¼ºÇØ ³õ´Â´Ù. ÄÄÆÄÀϸ¸ ÇØ ³õ´Â °ÍÀ̹ǷΠÃâ·Â ÇÔ¼ö¿¡¼­ ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. 1°³ÀÇ Ãâ·Â ¸ñ·Ï ID¸¦ dlÀ̶ó´Â º¯¼ö¿¡ ÀúÀåÇÏ°í ÀÌ ¸ñ·Ï¿¡ »ï°¢ÇüÀ» ±×¸®´Â ¸í·ÉµéÀ» ÀúÀåÇØ µÎ¾ú´Ù. DoDisplay¿¡¼­´Â »ö»ó°ú ÁÂÇ¥¸¦ Á¶±Ý¾¿ ¹Ù²ã °¡¸ç Ãâ·Â ¸ñ·ÏÀ» ¼¼¹ø È£ÃâÇÑ´Ù.

¼¼ °³ÀÇ »ï°¢ÇüÀÌ ³ª¶õÈ÷ Ãâ·ÂµÈ´Ù. Ãâ·Â ¸ñ·ÏÀÌ ¾Æ´Ï¶ó¸é °°Àº ¸í·ÉÀ» ÀÏÀÏÀÌ 3¹ø ³ª¿­ÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÇÔ¼ö°¡ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °Í°ú ¸¶Âù°¡Áö·Î Ãâ·Â ¸ñ·Ï³¢¸® ¼­·Î È£ÃâÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. º¹ÀâÇÑ µµÇüÀ» ¿©·¯ °³ÀÇ ¼­ºê µµÇüÀ¸·Î ³ª´« ÈÄ Ãâ·Â ¸ñ·ÏÀ» Á¶ÇÕÇÏ¿© ¿©·¯ ¹ø Àç»ç¿ëÇÒ ¼ö ÀÖ´Ù.

Ãâ·Â ¸ñ·ÏÀº ¼­¹ö¿¡ ÀúÀåµÈ´Ù. ±×·¡¼­ ½ÇÇàÇÒ ¶§¸¶´Ù ¸í·ÉÀ» ´Ù½Ã Àü´ÞÇÏÁö ¾ÊÀ½À¸·Î½á ¼Óµµ°¡ Á÷Á¢ ¸ðµåº¸´Ù ºü¸£´Ù. ÇÏÁö¸¸ ¸ðµç ¸í·ÉÀº ¼­¹ö»ó¿¡¼­ ½ÇÇàµÇ¹Ç·Î Ŭ¶óÀ̾ðÆ® »óŸ¦ º¯°æÇϰųª ÂüÁ¶ÇÏ´Â ¸í·ÉÀº Æ÷Ç﵃ ¼ö ¾ø´Ù.