10.ÅؽºÃ³

10-1.ºñÆ®¸Ê

OpenGLÀº 3Â÷¿ø ±×·¡ÇÈ ¶óÀ̺귯¸®ÀÌÁö¸¸ 2Â÷¿øÀÇ ±×·¡ÇÈÀ» °ü¸®ÇÏ´Â ±â´Éµµ Á¦°øÇÑ´Ù. ÅؽºÃ³ ¸ÊÇÎÀ» À§ÇØ 2Â÷¿ø ºñÆ®¸ÊÀ» ó¸®ÇÏ´Â ±â´ÉÀÌ ÇÊ¿äÇÏ¸ç ¶ÇÇÑ 3Â÷¿ø ±×·¡ÇÈÀÌ¶óµµ Åõ¿µ ÈÄ¿¡´Â 2Â÷¿øÀÌ µÇ¹Ç·Î ÀÌ ¶ÇÇÑ ´Ù·ê ¼ö ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ¹°·Ð Àü¹®ÀûÀÎ 2Â÷¿ø ±×·¡ÇÈ ¶óÀ̺귯¸®¿¡ ºñÇÒ ¹Ù´Â ¾Æ´Ï´Ù.

ºñÆ®¸ÊÀº ¹Ì¸® ¸¸µé¾îÁø À̹ÌÁö¸¦ ÀǹÌÇÏ¸ç ´Ù¾çÇÑ Å©±â¿Í »ö»óÀ» °¡Áú ¼ö ÀÖ´Ù. ±×·¯³ª OpenGL¿¡¼­´Â Èæ¹é À̹ÌÁö¸¸À» ºñÆ®¸ÊÀ̶ó°í ĪÇϸç Ä÷¯ À̹ÌÁö´Â Çȼ¿¸Ê(Pixelmap)À̶ó´Â º°µµÀÇ ¿ë¾î¸¦ »ç¿ëÇÑ´Ù. bit°¡ ¿ë¾î°¡ ¿ø·¡ 0°ú 1¸¸À» ÀǹÌÇÏ´Â Èæ¹éÀûÀÎ ¶æÀ̱⠶§¹®À̶ó°í ÇÑ´Ù. »ç½Ç µðÁöÅÐ À̹ÌÁö¶ó´Â Á¤ÀÇ°¡ °¡Àå Á¤È®Çѵ¥ ¾î·µç OpenGLÀº Ä÷¯ À̹ÌÁö¿Í Èæ¹é À̹ÌÁö¸¦ ±¸ºÐÇÑ´Ù°í ¾Ë¾Æ µÎÀÚ.

ºñÆ®¸ÊÀº º¸Åë ´ë¿ë·®ÀÇ ·¡½ºÅÍ µ¥ÀÌÅÍ·Î ±¸¼ºµÇ¹Ç·Î ÆÄÀÏ ÇüÅ·ΠÀúÀåµÇ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ±×·¯³ª ¾ÈŸ±õ°Ôµµ OpenGLÀº ÆÄÀÏ ÀÔÃâ·Â ±â´ÉÀ» Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î ÆÄÀÏÀ̳ª ¸®¼Ò½º·ÎºÎÅÍ ºñÆ®¸ÊÀ» »ý¼ºÇϱ⠾î·Æ´Ù. °£´ÜÇÑ À̹ÌÁö¶ó¸é ¸Þ¸ð¸®¿¡¼­ ·¡½ºÅÍ µ¥ÀÌÅ͸¦ Á÷Á¢ Á¤ÀÇÇÏ¿© ¸¸µé¾î ½á¾ß ÇÑ´Ù. ¸ð´« Á¾ÀÌ¿¡ ´ÙÀ½°ú °°ÀÌ À̹ÌÁö¸¦ µðÀÚÀÎÇØ º¸ÀÚ.

ºñÆ®¸ÊÀ» ¸¸µå´Â ¾ÆÁÖ ¿ø½ÃÀûÀÎ ¹æ¹ýÀε¥ °¢ Ä­ÀÇ Èò»öÀº ÀÌÁø¼ö 0¿¡ ´ëÀÀ½ÃÅ°°í °ËÁ¤»öÀº 1¿¡ ´ëÀÀ½ÃŲ´Ù. ÀÌ ¼ö¸¦ ³ª¿­Çϸé 2Áø¼ö°¡ ³ª¿À´Âµ¥ ÀÚ¸® ¼ö°¡ ³Ê¹« ¸¹À¸¹Ç·Î º¸Åë 16Áø¼ö·Î ¾ÐÃàÇÑ´Ù. ÀÌ·¸°Ô ¸¸µç 16Áø¼ö¸¦ ¹è¿­¿¡ ¼ø¼­´ë·Î ±â·ÏÇÏ¸é ºñÆ®¸ÊÀÌ µÈ´Ù. OpenGLÀÇ ºñÆ®¸ÊÀº ¾Æ·¡¿¡¼­ À§·Î Á¤ÀǵǹǷΠÁ¦ÀÏ ¾Æ·¡ÁÙºÎÅÍ ¹è¿­¿¡ ±â·ÏÇÑ´Ù.

ºñÆ®¸ÊÀÇ ·¡½ºÅÍ µ¥ÀÌÅʹ ó¸®ÀÇ È¿À²¼ºÀ» À§ÇØ 4¹ÙÀÌÆ® ´ÜÀ§·Î Á¤·ÄµÈ´Ù. ¿Ö³ÄÇÏ¸é ´ëºÎºÐÀÇ ÄÄÇ»ÅÍ´Â 32ºñÆ®ÀÌ°í Çѹø¿¡ 4¹ÙÀÌÆ®¾¿ ÀÐ°í ¾²´Â ¼Óµµ°¡ °¡Àå ºü¸£±â ¶§¹®ÀÌ´Ù. ÇÑ ÇàÀÌ 4ÀÇ ¹è¼ö°¡ ¾ÈµÇ´õ¶óµµ µÞ ºÎºÐ¿¡ ´õ¹Ì¸¦ Ãß°¡Çؼ­¶óµµ 4ÀÇ ¹è¼ö·Î ¸ÂÃß´Â °ÍÀÌ À¯¸®ÇÏ´Ù. ±×·¯³ª À§ À̹ÌÁö´Â ÇÑ ÇàÀÌ 2¹ÙÀÌÆ® ¹Û¿¡ ¾ÈµÇ¾î ´õ¹Ì¸¦ ³ÖÀ¸¸é ¹«·Á 2¹è³ª Ä¿Áø´Ù. Á¤·Ä ´ÜÀ§¸¦ ¹Ù²Ù°í ½Í´Ù¸é ´ÙÀ½ ÇÔ¼ö·Î ºñÆ®¸ÊÀÇ ÀúÀå ¹æ½ÄÀ» º¯°æÇØ¾ß ÇÑ´Ù.

 

void glPixelStore[f, i](GLenum pname, GLfloat param);

 

ÀÌ ÇÔ¼ö·Î ¹ÙÀÌÆ® ¼ø¼­(GL_PACK_SWAP_BYTES)³ª ¹ÙÀÌÆ® Á¤·Ä(GL_PACK_ALIGNMENT) µîÀÇ ¿É¼ÇÀ» ÁöÁ¤ÇÑ´Ù. ¸Þ¸ð¸®¿¡¼­ ºñÆ®¸ÊÀ» ÀÐÀ» ¶§ÀÇ Á¤·ÄÀº GL_UNPACK_ALIGNMENT ¿É¼ÇÀ¸·Î ÁöÁ¤Çϸç ÀÌ °ªÀÇ µðÆúÆ®°¡ 4À̹ǷΠ4¹ÙÀÌÆ® Á¤·ÄµÈ´Ù. 2³ª 1·Î ¹Ù²Ù¸é ´õ ÀÛÀº ´ÜÀ§·Î Á¤·ÄÇÒ ¼ö ÀÖµÇ ´Ü, °ªÀ» ÀÏÀÏÀÌ Àß¶ó¼­ Àоî¾ß ÇϹǷΠ¼Óµµ¿¡´Â ºÒ¸®ÇÏ´Ù. ºñÆ®¸ÊÀÇ Ãâ·Â À§Ä¡´Â ´ÙÀ½ ÇÔ¼ö·Î ÁöÁ¤ÇÑ´Ù.

 

void glRasterPos[2,3,4][s,i,f,d][v](x, y,z,w);

 

ÁÂÇ¥¸¦ ÁöÁ¤ÇÏ´Â ÇÔ¼öÀ̹ǷΠglVertex ÇÔ¼ö¿Í Çü½ÄÀÌ °ÅÀÇ µ¿ÀÏÇÏ´Ù. ÀÌ ÇÔ¼ö°¡ ÁöÁ¤ÇÑ ÁÂÇ¥°¡ ÇöÀç À§Ä¡°¡ µÇ¸ç ÀÌ À§Ä¡¿¡¼­ºÎÅÍ ºñÆ®¸ÊÀÌ Ãâ·ÂµÇ°í ºñÆ®¸Ê Ãâ·Â ÈÄ ÇöÀç À§Ä¡´Â ÀÚµ¿À¸·Î ´ÙÀ½ À§Ä¡·Î °»½ÅµÈ´Ù. ¸¶Ä¡ ÅؽºÆ® ¸ðµå¿¡¼­ ´ÙÀ½ ¹®ÀÚ°¡ Ãâ·ÂµÉ À§Ä¡¸¦ ÁöÁ¤ÇÏ´Â Ä¿¼­ÀÇ °³³ä°ú À¯»çÇÏ´Ù.

ÀÌ ÇÔ¼ö°¡ ÁöÁ¤ÇÑ ÁÂÇ¥´Â º¯È¯ÀÇ ¿µÇâÀ» ¹Þ´Â´Ù. ¸¸¾à º¯È¯¿¡ »ó°ü¾øÀÌ À©µµ¿ìÀÇ Æ¯Á¤ ÁÂÇ¥¿¡ Ãâ·ÂÇÏ·Á¸é glWindowPos ÇÔ¼ö¸¦ ´ë½Å »ç¿ëÇÑ´Ù. ±×·¯³ª ÀÌ ÇÔ¼ö´Â OpenGL 1.4 ÀÌÈĺÎÅ͸¸ Áö¿øµÇ¹Ç·Î À©µµ¿ìÁîÀÇ ±âº» ±¸Çö¿¡¼­´Â ´çÀå »ç¿ëÇÒ ¼ö ¾ø´Ù. ºñÆ®¸ÊÀ» Ãâ·ÂÇÒ ¶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove,  GLfloat ymove, const GLubyte * bitmap);

 

Á¦ÀÏ ¸¶Áö¸· ÀμöÀÎ bitmapÀÌ ºñÆ®¸ÊÀÇ ¸ð¾çÀ» Á¤ÀÇÇÏ´Â ·¡½ºÅÍ µ¥ÀÌÅÍ ¹è¿­ÀÌ´Ù. width, height´Â ºñÆ®¸ÊÀÇ Æø°ú ³ôÀ̸¦ Çȼ¿ ´ÜÀ§·Î ¾Ë·Á Áִµ¥ ÀÏÂ÷¿ø ¹è¿­ÀÇ ·¡½ºÅ͸¸À¸·Î´Â ºñÆ®¸ÊÀÇ ¸ð¾çÀ» ¾Ë ¼ö ¾ø±â ¶§¹®¿¡ Å©±â Á¤º¸¸¦ º°µµ·Î Á¦°øÇØ¾ß ÇÑ´Ù. À§ ºñÆ®¸ÊÀº 16 * 16 Å©±âÀ̹ǷΠÆø°ú ³ôÀÌ°¡ ¸ðµÎ 16ÀÌ´Ù.

xorig, yorig Àμö´Â ºñÆ®¸ÊÀÇ ¾î´À ºÎºÐÀÌ ÇöÀç À§Ä¡¿¡ Ãâ·ÂµÉ °ÍÀÎÁö ¿øÁ¡À» ÁöÁ¤ÇÑ´Ù. º¸ÅëÀº ÁÂÇÏ´ÜÀÎ (0,0)À» ÁöÁ¤ÇÏ¿© ºñÆ®¸ÊÀÇ ¾Æ·¡ÂÊÀÌ ÇöÀç À§Ä¡¿¡ Ãâ·ÂµÇÁö¸¸ ¸ð¾çÀÌ Æ¯ÀÌÇÑ ºñÆ®¸ÊÀº ¿øÁ¡À» º¯°æÇÒ ¼öµµ ÀÖ´Ù. xmove, ymove´Â ºñÆ®¸ÊÀ» ±×¸° ÈÄ¿¡ À̵¿ÇÒ ¾çÀ» °Å¸®¸¦ ÁöÁ¤ÇÑ´Ù. ¸¶Ä¡ ¹®ÀÚ¸¦ Ãâ·ÂÇÑ ÈÄ Ä¿¼­¸¦ ¿Å±âµíÀÌ ÇöÀç À§Ä¡¸¦ Àû´ç·® ¶ç¿î´Ù.

ºñÆ®¸ÊÀº ´Ü µÎ °¡Áö »öÀ¸·Î¸¸ ±¸¼ºµÈ ±×¸²ÀÌÁö¸¸ ±×·¸´Ù°í Çؼ­ ²À Èæ¹éÀ¸·Î¸¸ Ãâ·ÂÇØ¾ß ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. glColor ÇÔ¼ö·Î »ö»óÀ» ÁöÁ¤ÇÏ¸é ºñÆ®¸ÊÀÇ 1¿¡ ´ëÀÀµÇ´Â ºÎºÐ¿¡ ÀÌ »ö»óÀÌ Ãâ·ÂµÈ´Ù. ±×·¡¼­ ´Ü»ö ºñÆ®¸ÊÀÌÁö¸¸ ³ë¶õ»öÀ̳ª »¡°£»öÀ¸·Îµµ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¾Õ¿¡¼­ µðÀÚÀÎÇÑ 16 * 16 Å©±âÀÇ ºñÆ®¸ÊÀ» Ãâ·ÂÇÑ´Ù.

 

Bitmap

void DoDisplay()

{

     static GLubyte bitmap[] = {

          0x07, 0xe0, 0x18, 0x18, 0x20, 0x04, 0x43, 0xc2,

          0x44, 0x22, 0x88, 0x11, 0x81, 0x81, 0x81, 0x81,

          0x80, 0x01, 0x80, 0x01, 0x92, 0x49, 0x4c, 0x32,

          0x40, 0x02, 0x20, 0x04, 0x18, 0x18, 0x07, 0xe0,

     };

     glClear(GL_COLOR_BUFFER_BIT);

 

     glPixelStorei(GL_UNPACK_ALIGNMENT, 2);

     glColor3f(1,1,0);

     glRasterPos2f(0.5,0.5);

     glBitmap(16,16,0,0,20,0,bitmap);

     glBitmap(16,16,0,0,20,0,bitmap);

     glBitmap(16,16,0,10,20,0,bitmap);

 

     glFlush();

}

 

bitmap ¹è¿­¿¡ ·¡½ºÅÍ µ¥ÀÌÅ͸¦ 16Áø¼ö·Î ÀúÀåÇß´Ù. 2¹ÙÀÌÆ® Á¤·Ä·Î ÁöÁ¤ÇßÀ¸¹Ç·Î º°µµÀÇ ´õ¹Ì µ¥ÀÌÅ͸¦ »ðÀÔÇÒ ÇÊ¿ä´Â ¾øÀ¸¸ç ¾Æ·¡ÇàºÎÅÍ ¼ø¼­´ë·Î Á× ³ª¿­ÇÏ¸é µÈ´Ù. ¸¸¾à 4¹ÙÀÌÆ® Á¤·ÄÀ̶ó¸é ÇÑ Çà´ç ÃÖ¼Ò 4¹ÙÀÌÆ®¸¦ ½á¾ß ÇϹǷΠµÎ ¹ÙÀÌÆ®¸¶´Ù 0x00, 0x00À» »ðÀÔÇØ¾ß ÇÑ´Ù.

»ö»óÀº ³ë¶õ»öÀ¸·Î ÁöÁ¤Çß´Ù. ºñÆ®¸ÊÀÇ »ö»óÀº glBitmapÀ» È£ÃâÇÒ ¶§ Àû¿ëµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó glRasterPos¸¦ È£ÃâÇÒ ¶§ °áÁ¤µÇ¹Ç·Î glRasterPos ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ ¸ÕÀú ÁöÁ¤ÇØ¾ß ÇÑ´Ù. µÎ ÇÔ¼öÀÇ ¼ø¼­¸¦ ¹Ù²Ù¸é µðÆúÆ®ÀÎ Èò»öÀ¸·Î Ãâ·ÂµÈ´Ù. Ãâ·Â À§Ä¡´Â 0.5, 0.5·Î ÁöÁ¤ÇßÀ¸¹Ç·Î ¿À¸¥ÂÊ À§ Áß°£Âë¿¡¿¡¼­ºÎÅÍ ºñÆ®¸ÊÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù.

¼¼ °³ÀÇ ºñÆ®¸ÊÀ» Ãâ·ÂÇØ º¸¾Ò´Ù. xmove¸¦ ¸ðµÎ 20À¸·Î ÁöÁ¤ÇßÀ¸¹Ç·Î ºñÆ®¸Ê Çϳª¸¦ Ãâ·ÂÇÑ ÈÄ ¿À¸¥ÂÊÀ¸·Î 20Çȼ¿¸¸Å­ À̵¿ÇÑ´Ù. ºñÆ®¸Ê ÆøÀÎ 16º¸´Ù 4¸¸Å­ ´õ ÁÖ¾î ¾à°£¾¿ ¿©¹éÀ» ¶ç¿ü´Ù. ¸¸¾à ymove¸¦ 20À¸·Î ÁöÁ¤ÇÏ¸é ºñÆ®¸ÊÀº ¼¼·Î·Î ¿¬À̾î Ãâ·ÂµÉ °ÍÀÌ´Ù. xmove, ymove´Â ºñÆ®¸ÊÀ» ¿¬¼Ó Ãâ·ÂÇÒ ¶§ ¹æÇâ°ú °Å¸®¸¦ ÁöÁ¤ÇÏ´Â ÀμöÀÌ´Ù.

¾ÕÂÊ µÎ ºñÆ®¸ÊÀº ¿øÁ¡À» (0,0)À¸·Î ÁöÁ¤ÇÏ¿© ºñÆ®¸ÊÀÇ ÁÂÇÏ´ÜÀÌ ÇöÀç À§Ä¡¿¡ ´ëÀÀµÈ´Ù. ¼¼¹ø° ºñÆ®¸ÊÀº y ¿øÁ¡À» 10À¸·Î ÁÖ¾î ºñÆ®¸ÊÀÇ À§ÂÊ 10Çȼ¿ ÁöÁ¡ÀÌ ÇöÀç À§Ä¡¿¡ Ãâ·ÂµÇ¸ç ±×·¡¼­ ºñÆ®¸ÊÀÌ Á¶±Ý ¾Æ·¡ÂÊÀ¸·Î ³»·Á°£´Ù. ¿øÁ¡À» Á¶Á¤ÇÏ´Â ±â´ÉÀº ÆùƮó·³ º£À̽º°¡ °¢°¢ ´Ù¸¥ À̹ÌÁö¸¦ Ãâ·ÂÇÒ ¶§ ±âÁؼ±¿¡ ¸ÂÃß¾î ³ª¶õÈ÷ Ãâ·ÂÇϱâ À§Çؼ­ÀÌ´Ù.

3Â÷¿ø ±×·¡ÇÈ¿¡¼­´Â ±Û²Ãµµ ºñÆ®¸ÊÀ¸·Î Á¦ÀÛÇÏ¿© Á÷Á¢ Ãâ·ÂÇÏ´Â °æ¿ì°¡ ¸¹Àºµ¥ ¿µ¹®ÀÚÀÇ °æ¿ì ¾ËÆĺª¸¶´Ù º£À̽º°¡ Á¦°¢°¢ÀÌ´Ù. ÀÌ·± ±Û²Ã ºñÆ®¸ÊÀº ¸ð¾ç¿¡ µû¶ó ¿øÁ¡À» ´Þ¸®ÇØ¾ß ÇÑ´Ù. ÇѱÛÀº Á¤»ç°¢Çü ¹®ÀÚÀ̹ǷΠ¿øÁ¡ Á¶Á¤À» µû·Î ÇÒ ÇÊ¿ä°¡ ¾ø°í ±ÛÀÚÀÇ Æøµµ ´ëºÎºÐ ±ÕÀÏÇϹǷΠ¶ç¾î¾²´Â °£°Ýµµ ÀÏÁ¤ÇÏ´Ù. ¼¼Á¾´ë¿Õ ¸¸¼¼.

10-2.Çȼ¿¸Ê

Ä÷¯¸¦ Ç¥ÇöÇÒ ¼ö ÀÖ´Â Çȼ¿¸ÊÀº ºñÆ®¸Ê¿¡ ºñÇؼ­´Â À̹ÌÁö¸¦ ¸¸µé°Å³ª Ãâ·ÂÇϱâ ÈξÀ ´õ º¹ÀâÇÏ´Ù. Ãâ·Â ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.

 

void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *  data);

 

width, height´Â À̹ÌÁöÀÇ Æø°ú ³ôÀÌÀÌ´Ù. formatÀº Çȼ¿ÀÇ »ö»ó ±¸¼ºÀ̸ç GL_RGB, GL_BGA µîÀ» ÁöÁ¤ÇÑ´Ù. À̹ÌÁö ÆÄÀÏ¿¡ µû¶ó »ö»ó Á¤º¸°¡ RGB ¼øÀ¸·Î µÇ¾î ÀÖ´Â °ÍÀÌ ÀÖ°í BGA ¼øÀ¸·Î µÇ¾î ÀÖ´Â °ÍÀÌ ÀÖ´Ù. Æ÷¸ËÀÇ Á¾·ù´Â ·¹ÆÛ·±½º¸¦ Âü°íÇϱ⠹ٶõ´Ù. typeÀº data ¹è¿­ÀÇ ¿ä¼Ò ŸÀÔÀ» ÁöÁ¤Çϸç data°¡ ½ÇÁ¦ À̹ÌÁö Á¤º¸ÀÎ ·¡½ºÅÍ µ¥ÀÌÅÍÀÌ´Ù. ´ÙÀ½ ¿¹Á¦´Â °£´ÜÇÑ Çȼ¿¸ÊÀ» ¹è¿­·Î Á¤ÀÇÇÏ°í Ãâ·ÂÇÑ´Ù.

 

void DoDisplay()

{

     GLubyte data[32*32*3];

 

     for (int y=0;y<32;y++) {

          for (int x=0;x<32;x++) {

              data[y*32*3+x*3+0] = 0xff;

              data[y*32*3+x*3+1] = 0xff;

              data[y*32*3+x*3+2] = 0x00;

          }

     }

 

     glClear(GL_COLOR_BUFFER_BIT);

 

     glRasterPos2f(0.0,0.0);

     glDrawPixels(32, 32, GL_RGB, GL_UNSIGNED_BYTE, data);

 

     glFlush();

}

 

32*32Å©±âÀÇ Çȼ¿¸ÊÀ» Á¤ÀÇÇ쵂 °¢ Çȼ¿´ç »ö»ó Á¤º¸ 3°³¾¿ÀÌ ÇÊ¿äÇϹǷΠÃÑ ÇÊ¿äÇÑ ¹ÙÀÌÆ®¼ö´Â 32*32*3ÀÌ´Ù. ÀÌ·¸°Ô ÁغñµÈ ¹öÆ۾ȿ¡ °¢ Á¡¿¡ ´ëÇØ RGB ¿ä¼Ò¸¦ ÀÏÀÏÀÌ Á¤ÀÇÇϸé ÀÛÀ¸³ª¸¶ ¾ÆÀÌÄÜ Å©±â Á¤µµÀÇ À̹ÌÁö¸¦ ¸¸µé ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ ÀÛ¾÷Àº 16Áø¼ö 3072°³¸¦ ÀÏÀÏÀÌ ÃÄ ³Ö¾î¾ß ÇϹǷΠÁ¦Á¤½ÅÀ» °¡Áø »ç¶÷ÀÌ ¼ÕÀ¸·Î ÇÒ¸¸ÇÑ ÀÛ¾÷ÀÌ ¸øµÈ´Ù. À̹ÌÁö·ÎºÎÅÍ »ö»ó Á¤º¸¸¦ 16Áø¼ö·Î ÃßÃâÇØ ³»´Â °Í¸¸ Çصµ º¸Åë ÀÏÀÌ ¾Æ´Ï´Ù.

±×·¡¼­ ¾î¿ ¼ö ¾øÀÌ ·çÇÁ¸¦ µ¹¸ç ¸ðµç Çȼ¿¿¡ ´ëÇØ R, G ¿ä¼Ò´Â 255·Î ´ëÀÔÇÏ°í B ¿ä¼Ò´Â 0À¸·Î ´ëÀÔÇÏ¿© ³ë¶õ»öÀ¸·Î ä¿ö ³Ö¾ú´Ù. Á» ºñ°ÌÇÏÁö¸¸ ±ÍÂ÷´ÏÁòÀ¸·Î ÀÎÇØ ¸ðµç Çȼ¿ÀÌ ³ë¶õ»öÀÎ ÀÛÀº »ç°¢Çü À̹ÌÁö¸¦ Çϳª ¸¸µç °ÍÀÌ´Ù. ÀÌ·¸°Ô ¸¸µç À̹ÌÁö¸¦ È­¸é Áß¾Ó¿¡ Ãâ·ÂÇß´Ù. Çȼ¿¸ÊÀº ºñÆ®¸Ê°ú´Â ´Þ¸® ¿øÁ¡À» ÁöÁ¤ÇÏ´Â ±â´ÉÀÌ ¾øÀ¸¹Ç·Î ¹«Á¶°Ç À̹ÌÁöÀÇ ÁÂÇÏ´ÜÀÌ ÇöÀç À§Ä¡¿¡ Ãâ·ÂµÈ´Ù. ±×·¡¼­ Áß¾Ó¿¡¼­ ¾à°£ ¿À¸¥ÂÊ À§¿¡ À̹ÌÁö°¡ Ãâ·ÂµÇ¾ú´Ù.

ÀÌ ¿¹Á¦´Â Çȼ¿¸ÊÀ» Ãâ·ÂÇÏ´Â °¡Àå ¿ø·ÐÀûÀÎ ¹æ¹ýÀ» º¸À̱â À§ÇØ ÀÛ¼ºÇÑ °Í »ÓÀÌ´Ù. Á¦´ë·Î ¸ð¾çÀ» °®Ãá À̹ÌÁö¸¦ »ç¿ëÇÏ·Á¸é ÆÄÀÏ¿¡¼­ Àоî¿À´Â °ÍÀÌ ¿øÄ¢ÀûÀÌ´Ù. OpenGLÀº À̹ÌÁö ÆÄÀÏÀ» Àд ±â´ÉÀ» Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î ¿î¿µÃ¼Á¦º°·Î Àû´çÇÑ À̹ÌÁö Àбâ ÇÔ¼ö¸¦ ¸¸µé¾î »ç¿ëÇØ¾ß ÇÑ´Ù. ÀÌ °­Á´ À©µµ¿ìÁî ȯ°æ¿¡¼­ ½Ç½ÀÀ» ÁøÇàÇÏ°í ÀÖÀ¸¹Ç·Î À©µµ¿ìÁî API·Î Àб⠿ëÀÌÇÑ BMP ÆÄÀÏÀ» Ãâ·ÂÇß´Ù.

 

GLubyte *LoadBmp(const char *Path, int *Width, int *Height)

{

     HANDLE hFile;

     DWORD FileSize, dwRead;

     BITMAPFILEHEADER *fh=NULL;

     BITMAPINFOHEADER *ih;

     BYTE *pRaster;

 

     hFile=CreateFileA(Path,GENERIC_READ,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hFile==INVALID_HANDLE_VALUE) {

          return NULL;

     }

 

     FileSize=GetFileSize(hFile,NULL);

     fh=(BITMAPFILEHEADER *)malloc(FileSize);

     ReadFile(hFile,fh,FileSize,&dwRead,NULL);

     CloseHandle(hFile);

 

     int len = FileSize - fh->bfOffBits;

     pRaster=(GLubyte *)malloc(len);

     memcpy(pRaster, (BYTE *)fh+fh->bfOffBits, len);

 

     // RGB·Î ¼ø¼­¸¦ ¹Ù²Û´Ù.

     for (BYTE *p=pRaster;p < pRaster + len - 3;p+=3) {

          BYTE b = *p;

          *p = *(p+2);

          *(p+2) = b;

     }

 

     ih=(BITMAPINFOHEADER *)((PBYTE)fh+sizeof(BITMAPFILEHEADER));

     *Width=ih->biWidth;

     *Height=ih->biHeight;

 

     free(fh);

     return pRaster;

}

 

void DoDisplay()

{

     GLubyte *data;

     int Width, Height;

 

     glClear(GL_COLOR_BUFFER_BIT);

 

     data = LoadBmp("chestnut.bmp", &Width, &Height);

     if (data != NULL) {

          glRasterPos2f(-0.5,-0.5);

          glDrawPixels(Width, Height, GL_RGB, GL_UNSIGNED_BYTE, data);

          free(data);

     }

 

     glFlush();

}

 

ÀÌ ¿¹Á¦ÀÇ LoadBmp ÇÔ¼ö´Â Àμö·Î Àü´Þ¹ÞÀº À̹ÌÁö ÆÄÀϷκÎÅÍ ·¡½ºÅÍ µ¥ÀÌÅ͸¦ ¹è¿­·Î ÀоîµéÀδÙ. BMP ÆÄÀÏÀÇ ±¸Á¶¿Í ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö Á¤µµ¸¸ ¾µ ¼ö ÀÖÀ¸¸é ÀÌ Á¤µµ ÇÔ¼ö´Â ¾î·ÆÁö ¾Ê°Ô ¸¸µé ¼ö ÀÖ´Ù. ÆÄÀÏ¿¡¼­ ·¡½ºÅÍ µ¥ÀÌÅÍ¿¡ ÇØ´çÇÏ´Â ºÎºÐÀ» ÃßÃâÇÏ¿© ¹öÆÛ¿¡ º¹»çÇÏ¸é µÈ´Ù. ´Ü, BMP´Â »ö»ó Á¤º¸°¡ BGR ¼øÀ¸·Î ÀúÀåµÇ¾î ÀÖÀ¸¹Ç·Î RGB ¼ø¼­·Î ¹Ù²Ù¾î »ç¿ëÇß´Ù. OpenGL µµ BGR ¼øÀÇ À̹ÌÁö Æ÷¸ËÀÎ GL_BGRÀ» Áö¿øÇÏÁö¸¸ ¾ÈŸ±õ°Ôµµ À©µµ¿ìÁîÀÇ OpenGLÀº ¹öÀüÀÌ ³·Àº °ü°è·Î GL_BGRÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.

LoadBmp ÇÔ¼ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ºÐ¼®À̳ª ¼³¸íÀº »ý·«ÇÑ´Ù. °ü½ÉÀÖ´Â »ç¶÷Àº Win32 °ü·Ã ¼­ÀûÀ» Âü°íÇϱ⠹ٶõ´Ù. ¾î¶² Ã¥À̶ó°í ±»ÀÌ ²À Áý¾î¼­ ¼Ò°³ÇÏÁö´Â ¾Ê°ÚÁö¸¸ ½ÃÁß¿¡ ÁÁÀº Win32 ¼­ÀûµéÀÌ Âü ¸¹ÀÌ ÀÖ´Ù. À̹ÌÁö¸¦ ÆÄÀÏ·Î ÀúÀåÇÏ´Â ±â´ÉÀÌ ÇÊ¿äÇÏ´Ù¸é SaveBmp ÇÔ¼ö¸¦ ¸¸µé¾î »ç¿ëÇÏ¸é µÈ´Ù. ¸¸¾à À©µµ¿ìÁî°¡ ¾Æ´Ñ ´Ù¸¥ ¿î¿µÃ¼Á¦¿¡¼­ ½Ç½ÀÀ» ÁøÇàÇϰųª ÇÁ·ÎÁ§Æ®¸¦ ÇØ¾ß ÇÑ´Ù¸é ÇØ´ç ¿î¿µÃ¼Á¦ÀÇ À̹ÌÁö Á¶ÀÛ ¹æ¹ýÀ» Âü°íÇϰųª ¾Æ´Ï¸é ³²ÀÌ ¸¸µé¾î ³õÀº À¯Æ¿¸®Æ¼ ÇÔ¼ö¸¦ ±¸ÇØ º¸µµ·Ï ÇÏÀÚ. ½ÇÇàÇϸé Ä÷¯ À̹ÌÁö°¡ Ãâ·ÂµÉ °ÍÀÌ´Ù.

ÀÌ ¿¹Á¦¿¡¼­ »ç¿ëÇÑ chestnut.bmp ÆÄÀÏÀº Àß ÀÍÀº ¹ã À̹ÌÁöÀÌ¸ç ±Û¾´ÀÌ°¡ ¼Õ¼ö ÂïÀº »çÁøÀÌ´Ù. ¾î¶² À̹ÌÁöµçÁö BMP·Î º¯È¯Çؼ­ »ç¿ëÇϸé À§ ÇÔ¼ö¸¦ È°¿ëÇÒ ¼ö ÀÖ´Ù. ¾ÈŸ±õ°Ôµµ BMP´Â À©µµ¿ìÁî Àü¿ë Æ÷¸ËÀ̶ó ´Ù¸¥ ¿î¿µÃ¼Á¦¿¡¼­ »ç¿ëÇϱâ´Â ¾î·Æ´Ù. Á» ´õ ¹ü¿ëÀûÀÎ Æ÷¸ËÀ» »ç¿ëÇ쵂 ¾ÐÃà Æ÷¸Ëº¸´Ù´Â TGA°°Àº ºñ¾ÐÃà Æ÷¸ËÀÌ À¯¸®ÇÏ´Ù. JPG³ª PNG °°Àº ¾ÐÃà Æ÷¸Ëµµ º°µµÀÇ ±×·¡ÇÈ ¶óÀ̺귯¸®¸¦ È°¿ëÇÏ¸é ¹°·Ð »ç¿ëÇÒ ¼ö ÀÖ´Ù.

ÆÄÀϷκÎÅÍ À̹ÌÁö¸¦ ±¸ÇÏ´Â ¹æ¹ý ¿Ü¿¡ ÀÌ¹Ì Ãâ·ÂµÈ È­¸éÀÇ À̹ÌÁö¸¦ Àç»ç¿ëÇÒ ¼öµµ ÀÖ´Ù. »ö»ó ¹öÆÛÀÇ Çȼ¿°ªÀ» ¹öÆÛ·Î ÀоîµéÀ̰ųª »ö»ó ¹öÆÛÀÇ ÀÏÁ¤ ¿µ¿ªÀ» ´Ù¸¥ °÷À¸·Î º¹»çÇÏ¸é µÈ´Ù. ´ÙÀ½ ÇÔ¼öµéÀº È­¸éÀÇ ÀϺθ¦ ¹öÆÛ·Î ÀÐ¾î µéÀÌ°í È­¸é³¢¸® º¹»çÇÑ´Ù. glRasterPos·Î º¹»çÇÒ À§Ä¡¸¦ ÁöÁ¤ÇÑ ÈÄ ÀÌ ÇÔ¼ö·Î º¹»çÇÑ´Ù.

 

void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,  GLvoid * data);

void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);

 

º¹»çÇÒ ¿µ¿ª°ú º¹»çÇÒ Á¤º¸ÀÇ Á¾·ù¸¦ ¹àÈù´Ù. type¿¡ GL_COLOR¸¦ ÁöÁ¤ÇÏ¸é »ö»ó µ¥ÀÌÅ͸¦ º¹»çÇÏ´Â °ÍÀÌ°í GL_DEPTH³ª GL_STENCILÀ» ÁöÁ¤ÇÏ¸é ±íÀÌ Á¤º¸¿Í ½ºÅÙ½Ç Á¤º¸±îÁö º¹»çÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¹ã À̹ÌÁöÀÇ ÀϺθ¦ ¿ÞÂÊ ¾Æ·¡·Î º¹»çÇÑ´Ù.

 

void DoDisplay()

{

     GLubyte *data;

     int Width, Height;

 

     glClear(GL_COLOR_BUFFER_BIT);

 

     data = LoadBmp("chestnut.bmp", &Width, &Height);

     if (data != NULL) {

          glRasterPos2f(-0.5,-0.5);

          glDrawPixels(Width, Height, GL_RGB, GL_UNSIGNED_BYTE, data);

          free(data);

     }

 

     glRasterPos2f(-1.0,-1.0);

     glCopyPixels(100,100,80,50,GL_COLOR);

 

     glFlush();

}

 

½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.

À̹ÌÁö³¢¸® º¹»çÇؼ­ º° ½Ç¿ë¼ºÀÌ ¾ø¾î º¸ÀÌÁö¸¸ 3Â÷¿ø ±×·¡ÇÈÀ¸·Î ±×¸° À̹ÌÁöÀÇ ÀϺθ¦ À߶ó ÅؽºÃ³·Î »ç¿ëÇÒ ¶§´Â ÀÌ·± ±â¹ýÀÌ Æí¸®ÇÏ´Ù. È­¸é¿¡ ±×·ÁÁø ·¡½ºÅÍ µ¥ÀÌÅ͸¦ È°¿ëÇÏ´Â °ÍÀ̹ǷΠ´ë¿ë·®ÀÇ ¹è¿­À» ¼±¾ðÇÒ ÇÊ¿äµµ ¾ø°í ÆÄÀÏ ÀÔÃâ·ÂÀ» ÇÒ ÇÊ¿äµµ ¾ø´Ù.

ºñÆ®¸Ê ÀÛ¾÷Àº ½Ì±Û ¹öÆÛ È¯°æÀÏ ¶§´Â ÇÁ·ÐÆ® ¹öÆÛ¸¦ ´ë»óÀ¸·Î ÇÏÁö¸¸ ´õºí ¹öÆÛ¸µ ȯ°æ¿¡¼­´Â ¹é ¹öÆÛ¸¦ ´ë»óÀ¸·Î ¼öÇàµÈ´Ù. ´ë»ó ¹öÆÛ¸¦ °­Á¦·Î ¹Ù²Ù°í ½Í´Ù¸é ´ÙÀ½ µÎ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

 

void glDrawBuffer(GLenum mode);

void glReadBuffer(GLenum mode);

 

¹é ¹öÆÛ¿¡ ±×·Á ³õ°í ½º¿ÒÇÏ¸é ±ô¹Ú°Å¸²ÀÌ Á¦°ÅµÈ´Ù.

10-3.Æú¸®°ï ½ºÆ¼ÇÃ

Æú¸®°ï ½ºÆ¼ÇøµÀº ´Ù°¢ÇüÀÇ ³»ºÎ¸¦ ä¿ì´Â ¾ÆÁÖ °£´ÜÇÑ ¹æ¹ýÀÌ´Ù. 32*32 Å©±âÀÇ Èæ¹é ºñÆ®¸ÊÀ» Á¤ÀÇÇÏ°í ´ÙÀ½ µÎ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù.

 

glEnable(GL_POLYGON_STIPPLE);

void glPolygonStipple(const GLubyte * pattern);

 

patternÀº 32 * 32ÀÇ ºñÆ®¸Ê ÆÐÅÏÀ̹ǷΠÃÑ 128 ¹ÙÀÌÆ®·Î ±¸¼ºµÈ ¹è¿­À̾î¾ß ÇÑ´Ù. ºñÆ®¸ÊÀ» ¸¸µå´Â °ÍÀÌ ±ÍÂú¾Æ¼­ ±×·¸Áö »ç¿ëÇÏ´Â ¹æ¹ýÀº ¾ÆÁÖ ¿ø·ÐÀûÀÌ´Ù.

 

PolygonStipple

void DoDisplay()

{

     static GLubyte bitmap[] = {

          0x07, 0xe0, 0x18, 0x18, 0x20, 0x04, 0x43, 0xc2,

          0x44, 0x22, 0x88, 0x11, 0x81, 0x81, 0x81, 0x81,

          0x80, 0x01, 0x80, 0x01, 0x92, 0x49, 0x4c, 0x32,

          0x40, 0x02, 0x20, 0x04, 0x18, 0x18, 0x07, 0xe0,

          0x07, 0xe0, 0x18, 0x18, 0x20, 0x04, 0x43, 0xc2,

          0x44, 0x22, 0x88, 0x11, 0x81, 0x81, 0x81, 0x81,

          0x80, 0x01, 0x80, 0x01, 0x92, 0x49, 0x4c, 0x32,

          0x40, 0x02, 0x20, 0x04, 0x18, 0x18, 0x07, 0xe0,

          0x07, 0xe0, 0x18, 0x18, 0x20, 0x04, 0x43, 0xc2,

          0x44, 0x22, 0x88, 0x11, 0x81, 0x81, 0x81, 0x81,

          0x80, 0x01, 0x80, 0x01, 0x92, 0x49, 0x4c, 0x32,

          0x40, 0x02, 0x20, 0x04, 0x18, 0x18, 0x07, 0xe0,

          0x07, 0xe0, 0x18, 0x18, 0x20, 0x04, 0x43, 0xc2,

          0x44, 0x22, 0x88, 0x11, 0x81, 0x81, 0x81, 0x81,

          0x80, 0x01, 0x80, 0x01, 0x92, 0x49, 0x4c, 0x32,

          0x40, 0x02, 0x20, 0x04, 0x18, 0x18, 0x07, 0xe0,

     };

 

     glClear(GL_COLOR_BUFFER_BIT);

 

     glEnable(GL_POLYGON_STIPPLE);

     glPolygonStipple(bitmap);

 

     glBegin(GL_TRIANGLES);

     glVertex2f(0.0, 0.5);

     glVertex2f(-0.5, -0.5);

     glVertex2f(0.5, -0.5);

     glEnd();

     glFlush();

}

 

32*32 Á¤µµÀÇ Èæ¹é ºñÆ®¸ÊÀÌ¸é ±Ý¹æ ¸¸µé ¼ö ÀÖÁö¸¸ ½Ã°£¿¡ ¦i±â´Ù º¸´Ï ¾Õ¿¡¼­ ¸¸µé¾ú´ø ÀÛÀº ºñÆ®¸ÊÀ» ±×³É 4¹ø ¹Ýº¹Çß´Ù. Â÷ÈÄ ½Ã°£ÀÌ Çã¶ôµÇ¸é ¿¹»ÚÀåÇÑ À̹ÌÁö¸¦ µðÀÚÀÎÇØ º¸±â·Î ÇÑ´Ù. ¾î·µç µ¥ÀÌÅÍÀÇ °³¼ö´Â ä¿ö ³Ö¾úÀ¸¹Ç·Î Ãâ·ÂÀº µÇÁö¸¸ Çà ¿ÀÇÁ¼ÂÀÌ ¸ÂÁö ¾Ê¾Æ ±«»ó ¸ÁÄ¢ÇÑ ¹«´Ì°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.

½ºÆ¼ÇøµÀº ·¡½ºÅÍ µ¥ÀÌÅ͸¸À¸·Î µµÇüÀÇ ³»ºÎ¸¦ ä¿ï ¼ö ÀÖ´Ù´Â ¸é¿¡¼­ ¾ÆÁÖ °£ÆíÇÑ ¹æ¹ýÀ̱â´Ù. ±×·¯³ª °£ÆíÇѸ¸Å­ Á¦¾àÀÌ ¸¹¾Æ ½Ç¿ë¼ºÀº ¶³¾îÁø´Ù. ºñÆ®¸ÊÀº ¹«Á¶°Ç 32 * 32 Å©±â¿©¾ß ÇÏ¸ç ±×³ª¸¶µµ ´Ü»ö ¹«´Ì¸¸ °¡´ÉÇؼ­ Ç¥Çö·ÂÀÇ Á¦¾àÀÌ ½ÉÇÏ´Ù. °Ô´Ù°¡ ȸÀüÀ̳ª È®´ë, Ãà¼Òµµ Àû¿ëµÇÁö ¾Ê¾Æ Çö½ÇÀûÀ¸·Î °ÅÀÇ ¾µ ¸ð°¡ ¾ø´Ù. µµÇüÀÇ ³»ºÎ¸¦ ¿øÇÏ´Â ¹«´Ì·Î ä¿ì´Â Á¤¼®Àº ÅؽºÃ³ ¸ÊÇÎÀÌ´Ù.

10-4.ÅؽºÃ³ ¸ÊÇÎ

ÅؽºÃ³ ¸ÊÇÎ(Texture Mapping)Àº 3Â÷¿ø ¹°Ã¼ÀÇ Ç¥¸é¿¡ À̹ÌÁö¸¦ ÀÔÈ÷´Â ±â¹ýÀÌ´Ù. 3Â÷¿ø Ç¥¸é¿¡ ¿ïÅüºÒÅüÇÑ ¸ð¾çÀ̳ª ³ª¹« ¹«´Ì µîÀ» ±×·Á ³ÖÀ¸·Á¸é Á¶¸íÀ̳ª ¹°Ã¼ÀÇ ÀçÁúÀ» ÁöÁ¤ÇÏ´Â ¹æ¹ýÀ¸·Î´Â ÇÑ°è°¡ ¸¹´Ù. ´ë·®ÀÇ Á¤Á¡ÀÌ ÇÊ¿äÇÏ°í Á¤Á¡ÀÌ ¸¹¾ÆÁö¸é ¼Óµµµµ ´À·ÁÁø´Ù. ÅؽºÃ³ ¸ÊÇÎÀº ¹Ì¸® ¸¸µé¾îÁ® ÀÖ´Â À̹ÌÁö¸¦ ´Ù°¢ÇüÀÇ Ç¥¸é¿¡ ±×·Á ³ÖÀ½À¸·Î½á ÀÓÀÇÀÇ ¹«´Ì¸¦ ºü¸¥ ¼Óµµ·Î ±×·Á³»´Â ȹ±âÀûÀÎ ¹æ¹ýÀÌ´Ù.

ÅؽºÃ³ ¸ÊÇÎÀº À̹ÌÁö¸¦ Àоî¾ß ÇÏ°í °¢ ¸é¿¡ À̹ÌÁöÀÇ ¾îµðÂëÀÌ ´ëÀÀµÉ °ÍÀÎÁö¸¦ ÀÏÀÏÀÌ ÁöÁ¤ÇØ¾ß ÇϹǷΠ±¸Çö ´Ü°è´Â ´Ù¼Ò º¹ÀâÇÏ°í ¾î·Æ´Ù. À̹ÌÁöÀÇ µ¥ÀÌÅ;絵 ²Ï ¸¹Àº ÆíÀÌÁö¸¸ ´ÙÇàÈ÷ Çö´ëÀÇ ±×·¡ÇÈ Ä«µå´Â Çϵå¿þ¾î Â÷¿ø¿¡¼­ ÅؽºÃ³¸¦ Áö¿øÇϹǷΠ¼Óµµ´Â ¸¸Á·ÇÒ¸¸Å­ ºü¸¥ ÆíÀÌ´Ù. ÅؽºÃ³ ¸ÊÇÎ ±â´ÉÀ» »ç¿ëÇÏ·Á¸é ¸ÕÀú ÇØ´ç ±â´ÉÀ» ÄÑ¾ß ÇÑ´Ù.

 

glEnable(GL_TEXTURE_2D);

 

ÁÖ·Î 2Â÷¿ø Æò¸é À̹ÌÁö·Î ÅؽºÃ³¸¦ ÀÔÈ÷Áö¸¸ 1Â÷¿øÀ̳ª 3Â÷¿øÀÇ À̹ÌÁö¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. »ç¿ëÇÒ ÅؽºÃ³ÀÇ Â÷¿ø¿¡ µû¶ó °³º°ÀûÀ¸·Î È°¼ºÈ­½ÃÄÑ¾ß Çϸç Çѹø¿¡ Çϳª¸¸ È°¼ºÈ­ÇÒ ¼ö ÀÖ´Ù. Åë»óÀº 2Â÷¿ø ÅؽºÃ³¸¦ °¡Àå ¸¹ÀÌ »ç¿ëÇϸç ES ¹öÀüÀº 2Â÷¿ø¹Û¿¡ Áö¿øÇÏÁö ¾Ê´Â´Ù.

´ÙÀ½Àº ÅؽºÃ³·Î »ç¿ëÇÒ À̹ÌÁö¸¦ ¸Þ¸ð¸® ¹öÆÛ·Î ·ÎµåÇÑ´Ù. ¿©·¯ °¡Áö ¹æ¹ýÀ¸·Î À̹ÌÁö¸¦ ÁغñÇÒ ¼ö ÀÖÁö¸¸ °¡Àå ÀϹÝÀûÀÎ ¹æ¹ýÀº À̹ÌÁö ÆÄÀÏ¿¡¼­ Àоî¿À´Â °ÍÀÌ´Ù. ¾Õ¿¡¼­ ÁغñÇصРÇÔ¼ö·Î ·¡½ºÅÍ µ¥ÀÌÅ͸¦ ¹è¿­¿¡ ÀÐ¾î ³õ´Â´Ù. À̹ÌÁö¸¦ ¹Ù·Î »ç¿ëÇÒ ¼ö´Â ¾øÀ¸¸ç ÅؽºÃ³ ¸ÊÇο¡ Àû´çÇÑ ÇüÅ·Π°¡°øÇØ¾ß Çϴµ¥ À̶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * data);

 

Àμö°¡ ±²ÀåÈ÷ ¸¹À» »Ó¸¸ ¾Æ´Ï¶ó °¢ ÀμöÀÇ Àǹ̵µ ¾î·Æ°í ¼±ÅÃÇÒ ¼ö ÀÖ´Â °ªÀÇ Á¾·ùµµ ¸¹´Ù. targetÀº À̹ÌÁö·ÎºÎÅÍ ¾î¶² ÅؽºÃ³¸¦ ¸¸µé °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù. Æò¹üÇÑ ÅؽºÃ³¸¦ ¸¸µé ¼öµµ ÀÖ°í ÇÁ·Ï½Ã³ª Å¥ºê¸ÊÀ» ¸¸µé ¼öµµ ÀÖ´Ù. levelÀº ¹Ó¸ã ·¹º§ÀÌµÇ ¹Ó¸ÊÀ» »ç¿ëÇÏÁö ¾ÊÀ» ¶§´Â 0À¸·Î ÁöÁ¤ÇÑ´Ù.

³»ºÎ Æ÷¸ËÀº Åؼ¿ÀÇ Æ÷¸ËÀ» ÁöÁ¤Çϴµ¥ GL_RGB, GL_BGR µîµî ¿©·¯ °¡Áö Æ÷¸ËÀ¸·Î ¸¸µé ¼ö ÀÖ´Ù. width, height´Â ÅؽºÃ³ÀÇ ³ôÀÌÀÌµÇ ¹Ýµå½Ã 2ÀÇ °Åµì½Â Å©±â¿©¾ß ÇÏ¸ç ¿©±â¿¡ °æ°è¼±ÀÇ µÎ²²¸¦ ´õÇØ¾ß ÇÑ´Ù. °æ°è¼±ÀÌ ¾øÀ» °æ¿ì 32, 64, 128, 256 Á¤µµÀÇ Å©±â¸é µÈ´Ù. border´Â °æ°è¼±ÀÇ µÎ²²¸¦ ÁöÁ¤Çϴµ¥ ¾øÀ¸¸é 0À» ÁØ´Ù. format, type, data´Â ·¡½ºÅÍ µ¥ÀÌÅÍÀÇ Æ÷¸Ë°ú Çȼ¿ÀÇ Å¸ÀÔ, ±×¸®°í ·¡½ºÅÍ µ¥ÀÌÅÍ ¹è¿­ÀÌ´Ù.

ÅؽºÃ³¸¦ Àû¿ëÇϱâ Àü¿¡ ¸ÊÇο¡ °ü·ÃµÈ ¿©·¯ °¡Áö ¿É¼ÇµéÀ» º¯°æÇÒ ¼ö Àִµ¥ ´ëºÎºÐÀº µðÆúÆ®°¡ ¹«³­ÇϹǷΠµðÆúÆ®¸¦ ÀÏ´Ü Àû¿ëÇÏ¸é µÈ´Ù. ÀÚ¼¼ÇÑ °ÍÀº ´ÙÀ½ Ç׿¡¼­ µû·Î ¿¬±¸ÇØ º¸ÀÚ. ÅؽºÃ³°¡ ÁغñµÈ ´ÙÀ½Àº µµÇüÀÇ °¢ Á¤Á¡°ú ÅؽºÃ³ÀÇ ÁÂÇ¥¸¦ ´ëÀÀ½ÃŲ´Ù. µµÇüÀÇ ¾î´À ºÎºÐ¿¡ ÅؽºÃ³ÀÇ ¾îµðÂëÀ» Ãâ·ÂÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù.

ÅؽºÃ³ À̹ÌÁö´Â Å©±â°¡ Á¦°¢°¢Àε¥´Ù Å©±â¸¦ ¹Ù²Ù´Â °æ¿ìµµ Á¾Á¾ ÀÖÀ¸¹Ç·Î Çȼ¿ ´ÜÀ§·Î ÁÂÇ¥¸¦ ÁöÁ¤Çϸé ÀÏ°ü¼ºÀÌ ¾ø´Ù. ±×·¡¼­ 0 ~ 1 »çÀÌÀÇ ½Ç¼ö ÁÂÇ¥·Î ºñÀ²À» ÁöÁ¤ÇÑ´Ù. Á¤Á¡ÀÇ ÁÂÇ¥ Ç¥Çö½Ã º¸Åë xyzw ¸íĪÀ» ÃàÀ¸·Î »ç¿ëÇÏÁö¸¸ Ãà ¸íĪÀÌ °°À¸¸é Çò°¥¸®¹Ç·Î ÅؽºÃ³´Â strq¶ó´Â ÁÂÇ¥Ãà ¸íĪÀ» ´ë½Å »ç¿ëÇÑ´Ù.

À̹ÌÁöÀÇ Å©±â¿¡ »ó°ü¾øÀÌ ÅؽºÃ³ÀÇ ÁÂÇÏ´ÜÀº (0,0)ÀÌ°í ¿ì»ó´ÜÀº (1,1)ÀÌ´Ù. Á¤Áß¾ÓÀº ¹°·Ð (0.5, 0.5)°¡ µÉ °ÍÀÌ´Ù. °¢ Á¤Á¡¿¡ ÅؽºÃ³ÀÇ ÁÂÇ¥¸¦ ÁöÁ¤ÇÒ ¶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

 

void glTexCoord[1,2,3,4][s,i,f,d][v](s, t, r, q);

 

Á¤Á¡¿¡ ÅؽºÃ³ ÁÂÇ¥¸¦ ´ëÀÀ½ÃÄÑ ³õÀ¸¸é OpenGLÀÌ Á¤Á¡ÀÇ À§Ä¡¿¡ ÅؽºÃ³ÀÇ ´ëÀÀµÇ´Â Çȼ¿À» Àоî Ãâ·ÂÇÒ °ÍÀÌ´Ù. Á¤Á¡µéÀÇ Áß°£¿¡´Â Á¤Á¡°ú ÅؽºÃ³ÀÇ °Å¸® ºñÀ²¿¡ ¸Â°Ô Àû´çÈ÷ ´Ã¸®°Å³ª ÁÙ¿©¼­ Çȼ¿µéÀ» ´ëÀÀ½ÃÄÑ ´Ù°¢Çü Àüü¿¡ ÅؽºÃ³¸¦ ÀÔÈù´Ù. ÅؽºÃ³¿Í ´Ù°¢ÇüÀÇ Å©±â°¡ º¸Åë ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¹Ç·Î ½ºÆ®·¹ÄªÀº °ÅÀÇ Ç×»ó ¹ß»ýÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â ÇǶó¹Ìµå¿¡ ´ë¸®¼® ¸ð¾çÀÇ ÅؽºÃ³¸¦ ÀÔÈù´Ù.

 

Mapping

#include <windows.h>

#include <gl/glut.h>

#include <stdio.h>

 

void DoDisplay();

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

void DoMenu(int value);

GLfloat xAngle, yAngle, zAngle;

GLint EnvMode = GL_REPLACE;

GLint TexFilter = GL_LINEAR;

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

       ,LPSTR lpszCmdParam,int nCmdShow)

{

     glutCreateWindow("OpenGL");

     glutDisplayFunc(DoDisplay);

     glutKeyboardFunc(DoKeyboard);

     glutCreateMenu(DoMenu);

     glutAddMenuEntry("Replace",1);

     glutAddMenuEntry("Modulate",2);

     glutAddMenuEntry("Add",3);

     glutAddMenuEntry("Nearest Filter",4);

     glutAddMenuEntry("Linear Filter",5);

     glutAttachMenu(GLUT_RIGHT_BUTTON);

     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 DoMenu(int value)

{

     switch(value) {

     case 1:

          EnvMode = GL_REPLACE;

          break;

     case 2:

          EnvMode = GL_MODULATE;

          break;

     case 3:

          EnvMode = GL_ADD;

          break;

     case 4:

          TexFilter = GL_NEAREST;

          break;

     case 5:

          TexFilter = GL_LINEAR;

          break;

     }

     glutPostRedisplay();

}

 

GLubyte *LoadBmp(const char *Path, int *Width, int *Height)

{

     HANDLE hFile;

     DWORD FileSize, dwRead;

     BITMAPFILEHEADER *fh=NULL;

     BITMAPINFOHEADER *ih;

     BYTE *pRaster;

 

     hFile=CreateFileA(Path,GENERIC_READ,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hFile==INVALID_HANDLE_VALUE) {

          return NULL;

     }

 

     FileSize=GetFileSize(hFile,NULL);

     fh=(BITMAPFILEHEADER *)malloc(FileSize);

     ReadFile(hFile,fh,FileSize,&dwRead,NULL);

     CloseHandle(hFile);

 

     int len = FileSize - fh->bfOffBits;

     pRaster=(GLubyte *)malloc(len);

     memcpy(pRaster, (BYTE *)fh+fh->bfOffBits, len);

 

     // RGB·Î ¼ø¼­¸¦ ¹Ù²Û´Ù.

     for (BYTE *p=pRaster;p < pRaster + len - 3;p+=3) {

          BYTE b = *p;

          *p = *(p+2);

          *(p+2) = b;

     }

 

     ih=(BITMAPINFOHEADER *)((PBYTE)fh+sizeof(BITMAPFILEHEADER));

     *Width=ih->biWidth;

     *Height=ih->biHeight;

 

     free(fh);

     return pRaster;

}

 

void DoDisplay()

{

     GLubyte *data;

     int Width, Height;

 

     // ÅؽºÃ³ À̹ÌÁö Áغñ

     glEnable(GL_TEXTURE_2D);

     data = LoadBmp("marble64.bmp", &Width, &Height);

     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Width, Height,

          0, GL_RGB,  GL_UNSIGNED_BYTE, data);

     free(data);

 

     // ÅؽºÃ³ ȯ°æ ¼³Á¤

     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, EnvMode);

 

     // ÅؽºÃ³ ÇÊÅÍ ¼³Á¤

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, TexFilter);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, TexFilter);

 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

     glShadeModel(GL_FLAT);

     glEnable(GL_DEPTH_TEST);

 

     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);

 

     // ¾Æ·§¸é Èò ¹Ù´Ú

     glBegin(GL_QUADS);

     glColor3f(1,1,1);

     glTexCoord2f(0.0, 1.0);

     glVertex2f(-0.5, 0.5);

     glTexCoord2f(1.0, 1.0);

     glVertex2f(0.5, 0.5);

     glTexCoord2f(1.0, 0.0);

     glVertex2f(0.5, -0.5);

     glTexCoord2f(0.0, 0.0);

     glVertex2f(-0.5, -0.5);

     glEnd();

 

     // À§ÂÊ »¡°£ º¯

     glBegin(GL_TRIANGLE_FAN);

     glColor3f(1,0,0);

     glTexCoord2f(0.5, 0.5);

     glVertex3f(0.0, 0.0, -0.8);

     glTexCoord2f(1.0, 1.0);

     glVertex2f(0.5, 0.5);

     glTexCoord2f(0.0, 1.0);

     glVertex2f(-0.5, 0.5);

 

     // ¿ÞÂÊ ³ë¶õ º¯

     glColor3f(1,1,0);

     glTexCoord2f(0.0, 0.0);

     glVertex2f(-0.5, -0.5);

 

     // ¾Æ·¡ÂÊ ÃÊ·Ï º¯

     glColor3f(0,1,0);

     glTexCoord2f(1.0, 0.0);

     glVertex2f(0.5, -0.5);

 

     // ¿À¸¥ÂÊ ÆĶõ º¯

     glColor3f(0,0,1);

     glTexCoord2f(1.0, 1.0);

     glVertex2f(0.5, 0.5);

     glEnd();

 

     glPopMatrix();

     glFlush();

}

 

64 * 64 Å©±âÀÇ ´ë¸®¼® Ç¥¸é ¸ð¾ç À̹ÌÁö¸¦ marble64.bmp ÆÄÀÏ·Î ÁغñÇß´Ù. À̹ÌÁöÀÇ °¢ ºÎºÐÀ» ÇǶó¹ÌµåÀÇ °¢ Á¤Á¡¿¡ Àû´çÈ÷ ´ëÀÀ½ÃŲ´Ù. ÇǶó¹ÌµåÀÇ ²À´ë±â Á¤Á¡¿¡ À̹ÌÁöÀÇ Áß¾ÓÀ» ´ëÀÀ½ÃÅ°°í ³ª¸ÓÁö ¸ð¼­¸® Á¤Á¡¿¡´Â À̹ÌÁöÀÇ °°Àº ¹æÇ⠸𼭸®¸¦ ´ëÀÀ½ÃÄ×´Ù.

ÇǶó¹Ìµå¸¦ ¸¶·ç ¹Ù´Ú¿¡ ¿Ã·Á ³õ°í ´ë¸®¼® ¸ð¾çÀÌ ±×·ÁÁø º¸Àڱ⸦ Àß¶ó¼­ À§¿¡¼­ ±×´ë·Î ¾º¿î °Í°ú °°´Ù. Áß½ÉÀ» ±âÁØÀ¸·Î ÇǶó¹ÌµåÀÇ °¢ º¯¿¡ ¸Â´Â »ï°¢Çü Á¶°¢À» ÀÔÇûÀ¸¹Ç·Î Á¤¸é¿¡¼­ º¸¸é ±×³É ´ë¸®¼® Æò¸éó·³ º¸ÀÌÁö¸¸ ȸÀüÇØ º¸¸é °¢ ¸éÀÇ °æ°è°¡ µå·¯³­´Ù.

 

ÅؽºÃ³ ¹æ½ÄÀ» ¿©·¯ °¡Áö·Î º¯ÇüÇÏ´Â ±â´ÉµéÀÌ ¹Ì¸® ÀÛ¼ºµÇ¾î Àִµ¥ ´ÙÀ½ Ç׿¡¼­ µû·Î »ó¼¼ÇÏ°Ô ¿¬±¸ÇØ º¸ÀÚ.

10-5.ÅؽºÃ³ ¸ÊÇÎ ¿É¼Ç

ÅؽºÃ³ ¸ÊÇÎÀº ±²ÀåÈ÷ º¹ÀâÇÑ ¿¬»êÀ̾ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ¿É¼ÇµéÀÌ ¾ÆÁÖ ¸¹´Ù. ´ÙÀ½ ÇÔ¼ö´Â ÅؽºÃ³ ¸ÊÇΠȯ°æÀ» ÁöÁ¤ÇÑ´Ù.

 

void glTexEnv[f, i](GLenum target, GLenum pname, GLfloat param);

 

target Àμö´Â ¾î¶² ȯ°æÀ» Á¶Á¤ÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù. GL_TEXTURE_ENV, GL_TEXTURE_FILTER_CONTROL, GL_POINT_SPRITE Áß ÇϳªÀÌ´Ù. pnameÀº Á¶Á¤ÇÏ°íÀÚ ÇÏ´Â ¿É¼ÇÀÇ À̸§ÀÌ°í paramÀº ¿É¼ÇÀÇ °ªÀÌ´Ù. GL_TEXTURE_ENV_MODE´Â Åؼ¿ÀÇ »ö»ó°ú Áö¿À¸ÞÆ®¸®ÀÇ »ö»óÀ» °áÇÕÇÏ´Â ¹æ½Ä ÁöÁ¤Çϴµ¥ ´ÙÀ½ ¿©¼¸ °¡Áö ¹æ½ÄÀÌ ÀÖ´Ù.

 

¹æ½Ä

¼³¸í

GL_MODULATE

µÎ »ö»óÀ» °öÇÑ´Ù.

GL_REPLACE

»ö»óÀ» ¹«½ÃÇÏ°í ÅؽºÃ³·Î µ¤¾î¾´´Ù.

GL_ADD

µÎ »ö»óÀ» ´õÇÑ´Ù.

GL_DECAL

 

GL_BLEND

ºí·£µù »ö»ó°ú ÅؽºÃ³¸¦ È¥ÇÕÇÑ´Ù.

GL_COMBINE

 

 

ÇǶó¹ÌµåÀÇ °¢ ¸é¿¡ °íÀ¯ÀÇ »ö»óÀÌ ÁöÁ¤µÇ¾î Àִµ¥ °áÇÕ ¸ðµå¿¡ µû¶ó ÀÌ »ö»ó°ú ÅؽºÃ³ »ö»óÀÇ ¿¬»êÀÌ °áÁ¤µÈ´Ù. REPLACE·Î µ¤¾î ¾²¸é ÅؽºÃ³ÀÇ ¹«´Ì¸¸ ³ªÅ¸³ªÁö¸¸ MODULATE³ª ADD·Î È¥ÇÕÇÏ¸é ¸éÀÇ ¿ø·¡»ö°ú ³í¸®ÀûÀ¸·Î ¼¯ÀδÙ. Æ˾÷ ¸Þ´º·Î ¸ðµå¸¦ ¹Ù²ã º¸ÀÚ.

 

ÅؽºÃ³ À̹ÌÁö°¡ ´Ù°¢ÇüÀ» µ¤¾î ¹ö¸®´Â °ÍÀÌ ¾Æ´Ï¶ó ¿ø·¡»ö°ú ¼¯ÀÌ´Â È¿°ú°¡ ³ªÅ¸³­´Ù. ÀÌ ¸ðµå¿¡¼­´Â ¶È°°Àº ÅؽºÃ³¶óµµ ´Ù°¢ÇüÀÇ ¿ø·¡ »ö¿¡ µû¶ó ¹«´ÌÀÇ »ö»óÀÌ °áÁ¤µÇ¹Ç·Î ÇϳªÀÇ ÅؽºÃ³·Î ³ë¶õ»ö, ÃÊ·Ï»ö ´ë¸®¼®À» Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½ ÇÔ¼ö´Â ÅؽºÃ³ ÆĶó¹ÌÅ͸¦ ÁöÁ¤Çϴµ¥ ÀÌ ÆĶó¹ÌÅÍ¿¡ µû¶ó ÅؽºÃ³¸¦ ±×¸®´Â ·£´õ¸µ ¹æ½ÄÀÌ ´Þ¶óÁø´Ù.

 

void glTexParameter[f, i][v](GLenum target, GLenum pname, GLfloat param);

 

targetÀº ÅؽºÃ³ÀÇ Â÷¿øÀ» ÁöÁ¤ÇÑ´Ù. pnameÀº ÆĶó¹ÌÅÍÀÇ À̸§ÀÌ°í paramÀº °ªÀÌ´Ù. ÅؽºÃ³¿Í ¹°Ã¼ÀÇ ¸éÀûÀÌ Á¤È®ÇÏ°Ô ÀÏÄ¡ÇÏ´Â °æ¿ì°¡ µå¹°¹Ç·Î ÅؽºÃ³¸¦ ´Ã¸®°Å³ª ÁÙ¿©¼­ ÀÔÇô¾ß ÇÑ´Ù. ÅؽºÃ³ ¸ÊÀ¸·ÎºÎÅÍ ÀÔÈú »ö»óÀ» °è»êÇÏ´Â °úÁ¤À» ÅؽºÃ³ ÇÊÅ͸µÀ̶ó°í ÇÑ´Ù. GL_TEXTURE_MIN_FILTER´Â Ãà¼Ò½ÃÀÇ ÇÊÅ͸µÀ» ÁöÁ¤ÇÏ°í GL_TEXTURE_MAG_FILTER´Â È®´ë½ÃÀÇ ÇÊÅ͸µÀ» ÁöÁ¤ÇÑ´Ù. ÁÖ·Î ´ÙÀ½ µÎ °¡Áö ÇÊÅÍ°¡ »ç¿ëµÈ´Ù.

 

¡á ÃִܰŸ®(GL_NEAREST) : ºñÀ²»ó ´ëÀÀµÇ´Â À§Ä¡ÀÇ Åؼ¿°ªÀ» ±×´ë·Î »ç¿ëÇÑ´Ù. ¾Ë°í¸®ÁòÀº ´Ü¼øÇÏÁö¸¸ Ç°ÁúÀº ¶³¾îÁø´Ù.

¡á ¼±Çü(GL_LINEAR) : ´ëÀÀµÇ´Â À§Ä¡ ÁÖº¯ÀÇ Åؼ¿°ª¿¡ ´ëÇÑ Æò±ÕÀ» °è»êÇÑ´Ù. ¿À¹öÇì´õ°¡ ¸¹Áö¸¸ Ç°ÁúÀº ÈξÀ ´õ ÁÁ´Ù.

 

Ãà¼Ò½ÃÀÇ µðÆúÆ®´Â GL_NEAREST_MIPMAP_LINEARÀ̸ç È®´ë½ÃÀÇ µðÆúÆ®´Â GL_LINEARÀÌ´Ù. ¿¹Á¦¿¡¼­´Â ÀǵµÀûÀ¸·Î 64 Å©±âÀÇ ÀÛÀº ÅؽºÃ³¸¦ ÀÔÇô ³õ°í ÇÊÅ͸µÀ» Åä±ÛÇØ º¸¾Ò´Ù.  Â÷À̸¦ ºÐ¸íÈ÷ º¸°í ½ÍÀ¸¸é âÀ» Å©°Ô Çؼ­ µµÇüÀ» È®´ëÇÑ »óÅ·ΠÇÊÅ͸µÀ» ¹Ù²ã º¸¸é µÈ´Ù.

 

LINEAR ÇÊÅ͸µÀº ºÎµå·´°Ô È®´ëµÇÁö¸¸ NEAREST ÇÊÅ͸µÀº Ç°ÁúÀÌ ÈξÀ ´õ °ÅÄ¥¸ç °è´Ü Çö»óµµ ³ªÅ¸³­´Ù. ¹°·Ð ¼Óµµ´Â ¹Ý´ë°ÚÁö¸¸ ÀÌ Á¤µµ µµÇü¿¡¼­ ¼ÓµµÂ÷¸¦ ½Ç°¨Çϱâ´Â ¾î·Æ´Ù. ÅؽºÃ³¸¦ ´õ Å« °ÍÀ¸·Î »ç¿ëÇϸé È®´ë¿¡ ÀÇÇÑ ºÎÀÛ¿ëÀÌ °¨¼ÒÇϹǷΠǰÁúÀº ´õ ÁÁ¾ÆÁø´Ù.

GL_TEXTURE_WRAP_S, T, R ÆĶó¹ÌÅÍ´Â °¢ Ãà¿¡ ´ëÇÑ ÅؽºÃ³ ·¦ÇÎ ¹æ½ÄÀ» ÁöÁ¤ÇÏ¸ç ´ÙÀ½°ªÁß Çϳª¸¦ ÁöÁ¤ÇÑ´Ù.

 

·¦ÇÎ

¼³¸í

GL_CLAMP

°æ°è ºÎ±ÙÀ» ¹Ýº¹ÇÑ´Ù.

GL_CLAMP_TO_BORDER

°æ°è Åؼ¿ÀÇ °ªÀ» ¹Ýº¹ÇÑ´Ù.

GL_CLAMP_TO_EDGE

 

GL_MIRRORED_REPEAT

¹Ý»çµÈ ¸ð¾çÀ¸·Î ¹Ýº¹ÇÑ´Ù.

GL_REPEAT

¹Ýº¹ÇÑ´Ù.

 

ÅؽºÃ³ ¹üÀ§¿Í Åؼ¿ ¹üÀ§°¡ ÀÏÄ¡ÇÏÁö ¾ÊÀ» °æ¿ì ¹Ýº¹ ¹× °æ°è ºÎ±ÙÀÇ Ã³¸® ¹æ½ÄÀ» ÁöÁ¤ÇÑ´Ù. ÀÌ ¿¹Á¦´Â ÅؽºÃ³°¡ ´Ù°¢Çüº¸´Ù ÀÛÀ¸¹Ç·Î ÀÌ ÆĶó¹ÌÅ͸¦ ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.