ÀÔü µµÇüÀº ¾ÆÁÖ ¸¹Àº Á¤Á¡µé°ú °ü·Ã Á¤º¸µé·Î ±¸¼ºµÈ´Ù. ±×·²½ÎÇÑ ÀÔü µµÇü Çϳª¸¦ ¸¸µé·Á 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 ÇÔ¼ö¸¦ ¼ø¼´ë·Î È£ÃâÇÒ °ÍÀÌ´Ù. µü ÇϳªÀÇ ÇÔ¼ö È£Ã⸸À¸·Î ±×¸®±â¸¦ ¼öÇàÇϹǷΠ¸Þ¸ð¸®¸¦ ÈξÀ ´ú Â÷ÁöÇÏ°í ¼Óµµµµ ¿ùµîÈ÷ ºü¸£´Ù.
¾Õ ¿¹Á¦´Â ¹è¿À» Á¤Á¡¿¡ Á¤ÀÇÇÔÀ¸·Î½á Äڵ尡 ÈξÀ ´õ ª¾ÆÁ³°í ¼Óµµµµ »¡¶óÁ³´Ù. ±×·¯³ª ¾ÆÁ÷ »ö»óµµ ÀÔÈ÷Áö ¸øÇß°í °°Àº Á¤Á¡ÀÌ ¿©·¯ ¹ø Áߺ¹µÇ¾î ÀÖ¾î ¹º°¡ Çã¼úÇØ º¸ÀδÙ. ¹°·Ð ¹®Á¦Á¡À» ÇØ°áÇÒ ¼ö ÀÖ´Â ¸íÄèÇÑ ¹æ¹ýµéÀÌ Á¦°øµÈ´Ù. ÇǶó¹Ìµå¸¦ ±¸¼ºÇÏ´Â »ï°¢ÇüµéÀº Á¤Á¡µéÀ» °øÀ¯Çϴµ¥ ÀÌ Á¤Á¡µéÀ» Çϳª·Î ÇÕÃļ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÇǶó¹Ìµå´Â ´ÙÀ½ ´Ù¼¸ °³ÀÇ Á¤Á¡À¸·Î ±¸¼ºµÈ´Ù.
°¢ Á¤Á¡µéÀ» ¹è¿¿¡ Çѹø¾¿¸¸ ³ª¿ÇØ ³õ°í µµÇüÀº ¾î´À Á¤Á¤µé·Î ±¸¼ºµÇ´ÂÁö À妽º¸¸ ¹àÈûÀ¸·Î½á Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î 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°³·Î ÁÙ¾î µé¾ú´Ù. ´ë½Å ÀÌ Á¤Á¡µéÀÌ ¾î¶»°Ô Á¶ÇÕµÇ¾î »ï°¢ÇüÀ» ±¸¼ºÇÏ´ÂÁö À妽º ¹è¿ÀÌ Ãß°¡µÇ¾ú´Ù. ´çÀåÀº Å« À̵æÀÌ ¾ø´Â °Í °°Áö¸¸ ÁÂÇ¥ ¿Ü¿¡ »ö»óÀ̳ª ÅؽºÆ® ÁÂÇ¥ µîÀÇ Á¤º¸°¡ ´õ µé¾î°¡¸é À妽º¸¦ ¾²´Â °ÍÀÌ ÈξÀ ´õ À¯¸®ÇÏ´Ù.
´ÙÀ½Àº »ö»ó ¹è¿µµ Àû¿ëÇÏ¿© °¢ ¸é¿¡ »ö»óÀ» ÀÔÇô º¸ÀÚ. Á¤Á¡ ¹è¿°ú »ç¿ëÇÏ´Â ¹æ¹ýÀ̳ª ±¸¼º ¿ø¸®´Â °ÅÀÇ ºñ½ÁÇÏ´Ù. °¢ Á¤Á¡¿¡ ÇØ´çÇÏ´Â »ö»óÀ» ¹è¿·Î Á¤ÀÇÇØ µÎ°í À§Ä¡¸¦ °¡¸£ÃÄ ÁØ´Ù. ¸éÀ» ä¿ï °ÍÀ̹ǷΠÆú¸®°ï ¸ðµå´Â ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ¾øµÇ ´ë½Å ¸é³¢¸® ÀüÈÄ °ü°è¸¦ Ç¥ÇöÇϱâ À§ÇØ ±íÀÌ Å×½ºÆ®´Â ÇØ¾ß ÇÑ´Ù.
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 ÇÔ¼ö¸¦ È£ÃâÇϸé ÀÎÅ͸®ºê ¹è¿¿¡¼ ÇÊ¿äÇÑ °ªÀ» ¾Ë¾Æ¼ ²¨³» »ç¿ëÇÒ °ÍÀÌ´Ù. ¼Ò½º°¡ ÈξÀ ´õ ª¾ÆÁö°í ¹è¿À» °ü¸®Çϱ⵵ ´õ ¼ö¿ùÇÏ´Ù.
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¹ø ³ª¿ÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÇÔ¼ö°¡ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °Í°ú ¸¶Âù°¡Áö·Î Ãâ·Â ¸ñ·Ï³¢¸® ¼·Î È£ÃâÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. º¹ÀâÇÑ µµÇüÀ» ¿©·¯ °³ÀÇ ¼ºê µµÇüÀ¸·Î ³ª´« ÈÄ Ãâ·Â ¸ñ·ÏÀ» Á¶ÇÕÇÏ¿© ¿©·¯ ¹ø Àç»ç¿ëÇÒ ¼ö ÀÖ´Ù.
Ãâ·Â ¸ñ·ÏÀº ¼¹ö¿¡ ÀúÀåµÈ´Ù. ±×·¡¼ ½ÇÇàÇÒ ¶§¸¶´Ù ¸í·ÉÀ» ´Ù½Ã Àü´ÞÇÏÁö ¾ÊÀ½À¸·Î½á ¼Óµµ°¡ Á÷Á¢ ¸ðµåº¸´Ù ºü¸£´Ù. ÇÏÁö¸¸ ¸ðµç ¸í·ÉÀº ¼¹ö»ó¿¡¼ ½ÇÇàµÇ¹Ç·Î Ŭ¶óÀ̾ðÆ® »óŸ¦ º¯°æÇϰųª ÂüÁ¶ÇÏ´Â ¸í·ÉÀº Æ÷Ç﵃ ¼ö ¾ø´Ù.