3Â÷¿ø ±×·¡ÇÈÀÇ ¿ø¸® ÀÌÇØ

 OpenGL¿¡ µé¾î°¡±â¿¡ ¾Õ¼­¼­ °£´ÜÇÏ°Ô 3Â÷¿ø ±×·¡ÇÈÀÇ ÆÄÀÌÇÁ ¶óÀÎÀ» ÀÌÇØÇÏ°í ³Ñ¾î°¡´Â°Ô ÁÁÀ» µí ½Í¾î¼­ °£´ÜÇϰÔ
 3D-->2D·Î º¯È¯ÀÌ µÇ´Â °úÁ¤¿¡ ´ëÇØ¼­ Çϳª¾¿ ¾Ë¾Æ º¸°í OpenGL¿¡ ´ëÇØ¼­ ¾Ë¾Æº»´Ù.

 ÀÌ ¹Ù·Î ¾ÕÀÇ ³»¿ëÀº OpenGL·Î ÇÁ·Î±×·¡¹ÖÀ» Çϱâ À§Çؼ­ óÀ½¿¡ ¼¼ÆÃ ÇÏ´Â ºÎºÐ°ú °£´ÜÇÑ ÇÔ¼öµéÀ» ºÒ·¯ µé¿©¼­ OpenGL
 ÀÇ ±×·¡ÇÈ Ã³¸®¿¡ °üÇÑ ºÎºÐÀ» ÀÌÇØÇØ º» °ÍÀÌ¶ó±¸ »ý°¢À» ÇÏ¸é µÇ°í ÀÌ ¾Æ·¡ ºÎºÐÀº Direct3DºÎºÐ¿¡¼­´Â ¾î¶»°Ô ÀÌ ºÎºÐÀ»
 ÀÌÇØÇÏ°í ±¸¼ºµÇ¾î ÀÖ´ÂÁö´Â ¸ð¸£°ÚÁö¸¸ OpenGL¿¡¼­ »ç¿ëµÇ´Â ÄÄÇ»ÅÍ ±×·¡ÇÈ ÆÄÀÌÇÁ ¶óÀÎÀ» ÀÌÇØÇØ º½À¸·Î½á 3D±×·¡ÇÈ¿¡
 ´ëÇÑ À̷еéÀ» ÀÌÇØ¸¦ ÇÏ°í ±× À̷еéÀ» ½ÇÁ¦ OpenGL¿¡¼­´Â ¾î¶² ÇÔ¼öµéÀ» ÀÌ¿ëÇÏ¿© »ç¿ëÀ» ÇÏ´ÂÁö ¾Ë¾Æº»´Ù.

·¡½ºÅÍÈ­´Â ¸ðµç ºÎºÐÀÌ ¸¶¹«¸®°¡ µÇ°í ³ª¼­ ¸ð´ÏÅÍ¿¡ »Ñ·ÁÁö´Â ºÎºÐÀÌ´Ù.
ÀÌ ¸ðµç ¿ë¾î¿¡ ´ëÇÑ ¼³¸íÀº Çϳª¾¿ Çϱ⿡´Â Á» ¹¹Çϱ¸ ±×³É ÀÌÁ¦ºÎÅÍ ³ª¿À´Â ºÎºÐÀ» Çϳª¾¿ Áý°í ³Ñ¾î °¡´Ù º¸¸é ÆÄÀÌÇÁ ¶ó
ÀÎÀ» ÀÌÇØ¸¦ ÇÒ ¼ö°¡ ÀÖÀ» °ÍÀÌ´Ù.

¿ì¼± 3Â÷¿øÀÇ ÁÂÇ¥°è°¡ ¾î¶»°Ô ¸ð´ÏÅÍÀÇ 2Â÷¿ø ÁÂÇ¥°è·Î ¹Ù²î´ÂÁö¿¡ ´ëÇØ¼­ ¾Ë¾Æ º»´Ù.

1.µð½ºÇ÷¹ÀÌ ÀåÄ¡·ÎºÎÅÍ °¡Àå ¸Õ ÁÂÇ¥°è·ÎºÎÅÍ ½ÃÀÛÇÑ´Ù. ±×¸²¿¡¼­ ¿ÞÂÊ¿¡ º¸ÀÎ¹Ù¿Í °°ÀÌ °¢°¢ÀÇ 3Â÷¿ø ¹°Ã¼´Â 3Â÷¿ø ¸ðµ¨¸µ ÁÂÇ¥°è¿¡¼­ Á¤ÀǵȴÙ. °´Ã¼ ÁÂÇ¥°è(object-coordinate systme) ¶Ç´Â Áö¿ª ÁÂÇ¥°è(local coordinate system)¶ó°í ºÎ¸£±âµµ ÇÑ´Ù.

2.Á¤ÀÇµÈ ¹°Ã¼´Â ¸ðµ¨¸µ º¯È¯¿¡ ÀÇÇØ ¼¼°è ÁÂÇ¥°è(world-coordinate system)·Î º¯È¯ µÇ´Âµ¥ ¿©±â¼­ ÇϳªÀÇ Àå¸éÀ̳ª ¿Ïº®ÇÑ °´Ã¼ÀÇ Ç¥ÇöÀÌ ÀÌ·ç¾î Áø´Ù.¹®Á¦ ÁÂÇ¥°è(problem coordinate system) ¶Ç´Â ÀÀ¿ë ÁÂÇ¥°è(application-coordinate system)¶ó ºÎ¸£±âµµ ÇÑ´Ù.

3Â÷¿ø °´Ã¼¸¦ µð½ºÇ÷¹ÀÌ¿¡ »ý¼ºÇϱâ À§Çؼ­´Â 2Â÷¿øÀ¸·Î Åõ¿µÇÏ¿© ÁÂÇ¥¸¦ »ý¼ºÇÑ´Ù.

3.ºä º¼·ýÀ» Á¤ÀÇÇϱâ À§ÇÑ ÁÂÇ¥°è·Î ºä±âÁØ ÁÂÇ¥°è(view-reference coordinate system)°¡ ÀÖ´Ù. ¶§¶§·Î ¿Þ¼Õ ÁÂÇ¥°è·Î ±¸ÇöµÇ±âµµ ÇÑ´Ù.

4.ºä ÁÂÇ¥°è ´ÙÀ½Àº Á¤±Ô Åõ¿µ ÁÂÇ¥°è·Î¼­(normalized-projection coordinate system) ¶Ç´Â 3Â÷¿ø È­¸é ÁÂÇ¥°è(3D screen coordinate)·Î¼­ ÆòÇàÅõ¿µ Á¤±Ô ºä º¼·ý ÁÂÇ¥°èÀÌ´Ù.

5.¸¶Áö¸·À¸·Î 3Â÷¿ø¿¡¼­ 2Â÷¿øÀ¸·ÎÀÇ Åõ¿µÀº 2Â÷¿ø ÀåÄ¡ ÁÂÇ¥°è(2D device-coordimate system)À» ÇÊ¿ä·Î ÇÑ´Ù.Á¤±Ô ÀåÄ¡ ÁÂÇ¥°è, À̹ÌÁö ÁÂÇ¥°è, ¶Ç´Â ÀåÄ¡ ÁÂÇ¥°è¶ó ºÎ¸£±âµµ ÇÑ´Ù.

±×·³ ´ÙÀ½À¸·Î 3Â÷¿ø ÁÂÇ¥°èÀÇ Á¤Á¡ÀÌ ¾î¶² ÆÄÀÌÇÁ ¶óÀÎÀ¸·Î ¸ð´ÏÅÍÀÇ ÁÂÇ¥°è·Î º¯È¯ÀÌ µÇ´ÂÁö ¾Ë¾Æ º¸ÀÚ.

1.¿ø·¡ÀÇ Á¤Á¡À» ¸ðµ¨ °üÃø Çà·Ä·Î °öÇÏ¿©,º¯È¯µÈ ½Ã°¢ ÁÂÇ¥°è¸¦ »ý¼ºÇÑ´Ù.

2.½Ã°¢ ÁÂÇ¥°è´Â Åõ¿µ Çà·ÄÀ» °öÇØ¼­ Ŭ¸®ÇÎ ÁÂÇ¥·Î º¯È¯µÈ´Ù.
   -->ÀÌ °úÁ¤¿¡¼­ °üÃø°ø°£ ¹ÛÀÇ ¸ðµç µ¥ÀÌÅ͸¦ È¿°úÀûÀ¸·Î Á¦°Å¸¦ ÇÑ´Ù.

3.Ŭ¸®ÇÎ ÁÂÇ¥´Â wÁÂÇ¥·Î ³ª´©¾î Á¤±ÔÈ­ ÀåÄ¡ ÁÂÇ¥°è·Î º¯È¯ÀÌ µÈ´Ù.
  -->À̶§ w°ªÀº »ç¿ëµÈ º¯È¯¿¡ µû¶ó Åõ¿µ Çà·ÄÀ̳ª ¸ðµ¨ °üÃø Çà·Ä¿¡ ÀÇÇØ º¯°æ µÉ ¼ö ÀÖ´Ù.

4.ÀÌ ¼¼ °ªÀÇ ÁÂÇ¥´Â ºäÆ÷Æ® º¯È¯¿¡ ÀÇÇØ 2Â÷¿ø Æò¸éÀ¸·Î ¸ÅÇεȴÙ.

´ëÃæ ÆÄÀÌÇÁ ¶óÀÎÀÌ ÀÌ·¸°Ô µ¹¾Æ°£´Ù. ±×·³ ÇϳªÇϳªÀÇ º¯È¯ÀÌ ¾î¶² ÇÔ¼ö·Î ÀÌ·ç¾îÁö´ÂÁö ¾Ë¾Æº»´Ù.
¿©±â¼­ ¹Ì¸® ¾Ë¾Æ µÎ°í °¥ °ÍÀÌ high-level,low-levelÂ÷¿øÀ¸·Î Opengl¿¡¼­´Â ÇÔ¼ö¸¦ Á¦°øÀ» Çϴµ¥....
½±°Ô ¸»Çؼ­ high-levelÀº µÎ ¹øÀÇ Çà·Ä ¿¬»êÀ» ÇØ¾ß ÇÏ´Â °æ¿ì ÇÔ¼ö Çϳª°¡ ±× ±â´ÉÀ» ÇÏ´Â °ÍÀ̱¸  low-levelÂ÷¿øÀº Çà·ÄÀ»
µÎ °³ ¸¸µé¾î¼­(¹Ì¸® ¸¸µé¾î Á® ÀÖ°ÚÁÒ?) µÎ ¹ø °öÇØ¼­ °ªÀ» ¾ò´Â °ÍÀÌ´Ù. ¿©±â¼­´Â ÀÌÇØ¸¦ ½±°Ô Çϱâ À§ÇØ low-levelÇ¥Çö°ú
high-levelÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â µÎ°¡Áö °æ¿ì¸¦ µé¾î º¸°Ú´Ù.

1.¸ðµ¨ °üÃø Çà·ÄÀº 4x4Çà·Ä·Î ¹°Ã¼ÀÇ À§Ä¡¿Í ¹æÇâÀ» ¼³Á¤Çϴµ¥ »ç¿ëÇØ º¯È¯µÈ ÁÂÇ¥°è¸¦ ³ªÅ¸³½´Ù.

  °¡Á¤:°¢º¯ÀÌ 10ÀÇ ±æÀ̸¦ °¡Áø À°¸éü¸¦ »ý¼ºÇÏ¿© yÃàÀÇ ¾çÀÇ ¹æÇâÀ¸·Î 10¸¸Å­ À̵¿½ÃÄѶó.

  - low-levelÇ¥Çö ¹æ¹ý-

   glutWireCube(10.0f); //°¢º¯ÀÌ 10ÀÇ ±æÀ̸¦ °¡Áö´Â À°¸éü »ý¼º
   // yÃàÀÇ ¾çÀÇ ¹æÇâÀ¸·Î 10¸¸Å­ À̵¿ÇÏ´Â Çà·ÄÀ» »ý¼ºÇÑ´Ù.

   //¸ðµ¨ °üÃø Çà·Ä°ú À§ÀÇ Çà·ÄÀ» °öÇÑ´Ù.

   //À°¸éü¸¦ ±×¸°´Ù.
   glutWireCube(10.0f);

   - high-levelÇÔ¼ö »ç¿ë -

   void glTranslatef(GLfloat x, GLfloat y, GLfloat z);

   glTranslatef(0.0f,10.0f,0.0f);
   glutWireCube(10.0f);

   ¿©±â¼­´Â ¿¹Á¦¸¦ À̵¿¸¸ ´Ù·ç¾ú´Âµ¥ ȸÀü,Å©±â º¯È¯µµ ¸ðµÎ ÀÌ ºÎºÐ¿¡¼­ ´Ù·ç°Ô µÈ´Ù. ´Ü¼øÇÏ°Ô Çà·ÄÀ» ÁöÁ¤À» ÇØ¼­ »ç¿ë
   À» ÇϰíÀÚ ÇÑ´Ù¸é low-levelÂ÷¿øÀ¸·Î Çϳª¾¿ ´ÜÀ§ Çà·ÄÀ̸é [1.0  0  0  0][0  1.0  0  0][0  0  1.0  0][0  0  0  1.0]Çà·ÄÀ»
   ¹è¿­·Î ¼±¾ðÀ» ÇØ¼­ »ç¿ëÀ» ÇÏ¸é µÈ´Ù. ÇÁ·Î±×·¡¸Ó°¡ »ý°¢À» ÇØ¼­ ÀÌ»óÇÑ ÁþÀ» ÇÒ·Á±¸ Çϴµ¥ high-levelÇÔ¼ö°¡ ¾ø´Ù¸é ¸ð
   ¸¦±î ¿Ö ±»ÀÌ ÀÌ·±ÁþÀ» ÇØ¾ß ÇÏ´ÂÁö´Â... ±Ùµ¥ low-levelÂ÷¿øÀ¸·Î ÇØÁÖ´Â°Ô ´õ ¼Óµµ°¡ ÁÁÀº °æ¿ìµµ ÀÖ´Ù±¸ ÇÑ´Ù.

2.½Ã°¢ ÁÂÇ¥°è´Â Åõ¿µ Çà·ÄÀ» °öÇØ¼­ Ŭ¸®ÇÎ ÁÂÇ¥·Î º¯È¯µÈ´Ù.
   -->ÀÌ °úÁ¤¿¡¼­ °üÃø°ø°£ ¹ÛÀÇ ¸ðµç µ¥ÀÌÅ͸¦ È¿°úÀûÀ¸·Î Á¦°Å¸¦ ÇÑ´Ù.

¸ÕÀú ½Ã°¢ ÁÂÇ¥°è¸¦ ¸¸µå´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æ º»´Ù. ÀÌ°Ç Á¶¸Á º¯È¯(viewing transformation)À̶󱸵µ ÇÑ´Ù.
Ä«¸Þ¶óÀÇ À§Ä¡¿Í ¹æÇâ(Ä«¸Þ¶ó°¡ ¹Ù¶óº¸´Â ¹æÇâ)À» º¯°æ ½ÃŲ´Ù.  

void glulookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz);

(eyex,eyey,eyez)´Â ÇöÀç ÁÖ½ÃÇϰí ÀÖ´Â ´«ÀÇ À§Ä¡¸¦ ÀǹÌÇϸç (centerx,centery,centerz)´Â ÁÖ½ÃÇϰí ÀÖ´Â Ä«¸Þ¶óÀÇ ÁÖ½ÃÁ¡À» Ç¥ÇöÇϸç (upx,upy,upz)´Â upvector¸¦ ÀǹÌÇÑ´Ù.

À§ ±×¸²¿¡¼­ Ä«¸Þ¶ó´Â ¿øÁ¡¿¡ À§Ä¡Çϰí ÁÖ½ÃÁ¡(reference point)Àº zÃà À½ÀÇ ¹æÇâÀ¸·Î -100À̸ç up vector´Â ¾çÀÇ yÃà ¹æÇâÀ̹ǷΠgluLookat(0.0, 0.0, 0.0, 0.0, 0.0, -100.0 ,0.0, 1.0, 0.0); À¸·Î ÄÚµùÀÌ °¡´ÉÇÏ´Ù.

** gluLookAt(4.0, 2.0, 1.0, 2.0, 4.0, -3.0, 2.0, 2.0, -1.0);

À§ ±×¸²¿¡¼­ Çѹø ºÁ º¸µµ·Ï ÇÏÀÚ. eyex,y,z´Â »¡°£ »öÀÇ ¼± ºÎºÐÀÌ´Ù. ±×·³ eyex,y,z´Â ÇØ°áÀÌ µÆ´Ù. ¹«¾ùÀÎÁö ´ÙÀ½À¸·Î

centerx,y,z´Â Ä«¸Þ¶ó°¡ º¸´Â ¹æÇâÀ» °áÁ¤À» ÇØÁØ´Ù. ¾ÕÀÇ eyex,y,z´Â ´ÜÁö Ä«¸Þ¶óÀÇ À§Ä¡ÀÏ»Ó ¾î´ÀÂÊÀ» º¼°ÇÁö´Â ´Ù¸¥ ¾î

¶² Á¡ÀÌ À־ ¹æÇâÀÌ ÀÖ´Â º¤ÅÍ °ªÀ¸·Î ÁÖÁö ¾Ê´Â ÀÌ»ó ¾î´ÀÂÊÀ» º¼Áö¸¦ ¸ð¸¥´Ù. ±×·¡¼­ centerx,y,z°¡ ±× ¹æÇâÀ» Àâ¾ÆÁØ´Ù.

¿©±â¼­´Â e¶ó´Â Àú Á¡ÀÌ ±× ±â´ÉÀ» ÇÑ´Ù. ±×·³ ÇϳªÇϳª¾¿ »ý°¢À» ÇØ º¸µµ·Ï ÇÏÀÚ. centerY°ªÀ» eY1Á¡À¸·Î À̵¿À» ½Ã۸é

¾î¶»°Ô º¸Àϱî¿ä? ´ç¿¬È÷ Ä«¸Þ¶ó´Â °¡¸¸È÷ ÀÖ´Â »óÅ¿¡¼­ º¸´Â °ÍÀÔ´Ï´Ù. ´ç¿¬È÷ ¸Ó¸® ºÎºÐÀÌ º¸À̰ÚÁÒ!! »ç¿ëÀÚ¿¡°Ô´Â ¹°Ã¼

°¡ ¾Æ·¡·Î ³»·Á°£ °Íó·³ º¸Àϰű¸¿ä..

±×·³ ZÃàÀ» »ý°¢ÇØ º¼±î¿ä!! eZ1°ú eZ2ÀÇ Â÷ÀÌ´Â ¹«¾ùÀϱî¿ä?

¾Æ¹« Â÷À̵µ ³ªÁú ¾Ê½À´Ï´Ù.  ¿Ö³Ä? ÀÌ°Ç ±×³É Ä«¸Þ¶ó°¡ ¾îµô º¸´ÂÁö¸¦ Á¤Çϴ°ÅÁö? Ä«¸Þ¶ó´Â ¿òÁ÷ÀÌÁö ¾Ê±â ¶§¹®ÀÌÁÒ..

±×·¯¸é Ä«¸Þ¶óÀÇ eyeZº¸´Ù ¿ÞÂÊÀ¸·Î °¡¸é ´ç¿¬È÷ °ËÁ¤»ö¸¸ º¸À̰ÚÁÒ.....

±×·³ ¸¶Áö¸·ÀÇ upx,y,z¸¦ º¼±î¿ä?

0, 1.0, 0À¸·Î ¼³Á¤À» Çϸé Ä«¸Þ¶óÀÇ +yÃàÀ¸·Î ¹ý¼± º¤ÅͰ¡ ³ª°£´Ù±¸ »ý°¢À» ÇÏ¸ç µÈ´Ù. ±×·³ ÀÌ ¹°Ã¼´Â ¹Ýµå½Ã ¼­ Àִ°Å

ó·³ º¸ÀδÙ. 0, -1.0, 0Àº -yÃàÀ¸·Î ³ª°¡¹Ç·Î ¹°Ã¼°¡ ¹°±¸³ª¹« ¼­±â¸¦ Çϰí ÀÖ´Ù. ´ÙÀ½À¸·Î 1.0, 0, 0Àº +xÃàÀ¸·Î ³ª°¡¹Ç·Î

¸Ó¸®°¡ ¿ÞÂÊ ´Ù¸®°¡ ¿À¸¥ÂÊÀ¸·Î ÇâÇÏ°Ô ´©¿öÀÖÀ» °ÍÀÌ´Ù.

±×¸²À» º¸°í ºñ±³Çغ¸±æ ¹Ù¶õ´Ù.

** ¿¹½Ã **

void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glLoadIdentity ();             /* clear the matrix */
           /* viewing transformation  */
  
 gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   glScalef (1.0, 2.0, 1.0);      /* modeling transformation */
   glutWireCube (1.0);
   glFlush ();
}

glulookAt()ÇÔ¼ö´Â Ä«¸Þ¶óÀÇ À§Ä¡¿Í Ä«¸Þ¶ó°¡ ¹Ù¶óº¸´Â °÷ÀÇ À§Ä¡, ±×¸®°í Ä«¸Þ¶óÀÇ À§ÂÊ ¹æÇâÀ» ÁöÁ¤ÇÔÀ¸·Î½á Á¶¸Á º¯È¯À»
¼³Á¤Çϴµ¥,»ó´çÈ÷ Á÷°üÀûÀÌ°í ¸í·áÇÏ´Ù.
¶Ç ´ÜÁ¡Àº GLU¶óÀ̺귯¸®¸¦ ¸µÅ©ÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. GLU¶óÀ̺귯¸®¸¦ »ç¿ëÇϱ⠽ȴٸé glRotate(),glTranslate()ÇÔ¼ö¸¦
glTranslate(0.0f, 0.0f, -10.0f)ÀÌ·¸°Ô ÇÏ°Ô µÇ¸é ¹°Ã¼ÀÇ ÁÂÇ¥°ªÀÌ -10¸¸Å­ zÃàÀ¸·Î ¸Ö¾îÁö¹Ç·Î ¾îÂ÷ÇÇ Ä«¸Þ¶ó°¡ ±×´ë·Î ÀÖ±â
¶§¹®¿¡ Ä«¸Þ¶ó¸¦ zÃàÀ¸·Î 10¸¸Å­ ¿Å±ä È¿°ú¸¦ ¹ß»ý ½ÃŲ´Ù. ±×·³ Ä«¸Þ¶óÀÇ À̵¿ ¸»±¸ ¹æÇâÀ» ¹Ù²Ù°Ô ÇÒ·Á¸é ¾î¶»°Ô ÇØ¾ß ÇÒ
±î?

void PlaneView(GLfloat planeX,GLfloat planeY,GLfloat planeZ,GLfloat roll,GLfloat pitch,GLfloat yaw)
{
   //·ÑÀº zÃà¿¡ ´ëÇÑ È¸Àü°¢ÀÌ´Ù.
   glRotatef(roll, 0.0f, 0.0f, 1.0f);
   //¿ä´Â yÃà¿¡ ´ëÇÑ È¸Àü°¢ÀÌ´Ù.
   glRotatef(yaw, 0.0f, 1.0f, 0.0f);
   //ÇÇÄ¡´Â xÃà¿¡ ´ëÇÑ È¸Àü°¢ÀÌ´Ù.
   glRotatef(pitch, 1.0f, 0.0f, 0.0f);
   //ºñÇà±â¸¦ ºñÇà±âÀÇ Àü¿ª ÁÂÇ¥·Î À̵¿
   glTranslatef(-planeX,-planeY,-planeZ);
}

 ÀÌ°Ç ±×³É Àֱ淡 ¿Ã·Á ³õÀº°Çµ¥ ³»¿ëÀº Àß ¸ð¸£°Ú´Ù.

Åõ¿µ¿¡ ´ëÇØ¼­ ±×·³ ¾Ë¾Æ º¸°Ú½À´Ï´Ù. Åõ¿µ¿¡´Â Á÷±³Åõ¿µ°ú Åõ½ÃÅõ¿µ(glFrustum(),gluPerspective())ÀÌ ÀÖ´Ù.

 

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

 Á÷±³ Åõ¿µÀº ¸ðµç ¸éÀÌ »ç°¢ÇüÀÌ´Ù. ÀÌ·ÐÀûÀ¸·Î´Â ¾Õ, µÚ, À§, ¾Æ·¡, ¿ÞÂÊ, ¿À¸¥ÂÊ ¸éÀÌ ¸ðµÎ °°´Ù. ÁÖ·Î È­¸é¿¡ Á¤È®ÇÑ ¸ð¾ç°ú Ä¡¼ö¸¦ Ç¥ÇöÇØ¾ßÇÏ´Â CAD³­ °ÇÃ༳°è¿¡ ¸¹ÀÌ »ç¿ëµÈ´Ù.

 glOrtho2D()´Â 2Â÷¿ø ÇüÅÂÀÇ Á÷±³ Åõ¿µÀ» Á¤ÀÇÇÑ´Ù.

oid reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); //ºäÆ÷Æ® ¿µ¿ªÀ» ¿ì¼± ÁöÁ¤À» ÇØ ÁØ´Ù .
   
glMatrixMode (GL_PROJECTION); //Çà·Ä ¸ðµå¸¦ Åõ¿µÀ» »ç¿ëÀ» ÇÑ´Ù±¸ ÁöÁ¤ÇÑ´Ù.
   glLoadIdentity (); //Ç×»ó ÃʱâÈ­¸¦ ÇØ ÁÖ¾î¾ß ÇÑ´Ù.
    //ÇöÀç º¯È¯ Çà·ÄÀ» ´ÜÀ§ Çà·Ä·Î ¹Ù²Ù¾î ÁØ´Ù. ¿©±â¼­´Â Åõ¿µ Çà·ÄÀ» ´ÜÀ§ Çà·Ä·Î º¯ÇüÇØ ÁØ´Ù.
    //ÀÌ°Ç º»ÁúÀûÀ¸·Î ÁÂÇ¥°è¸¦ ½Ã°¢ ÁÂÇ¥°è·Î ÃʱâÈ­ ÇÏ´Â °Í°ú °°´Ù.
   if (w <= h) //¾Æ·¡ÀÇ Åõ½ÃÅõ¿µÀº »ó°üÀº ¾øÁö¸¸ Á÷±³ Åõ¿µÀº µÎ °³ÀÇ °æ¿ì¸¦ »ý°¢ÇØ¾ß ÇÑ´Ù. »ç¿ëÀ» °ÅÀÇ ¾ÈÇÏ´Ï...
      
glOrtho (-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w,
         50.0*(GLfloat)h/(GLfloat)w, -1.0, 1.0);

   else
      
glOrtho (-50.0*(GLfloat)w/(GLfloat)h,
         50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0, -1.0, 1.0);

   glMatrixMode(GL_MODELVIEW); //ÀÌ ºÎºÐÀ» ¼³Á¤ÇØ ÁÖ´Â ÀÌÀ¯´Â ¿ì¸®°¡ »ç¿ëÇÑ GL_PROJECTIONÁï Åõ¿µ Çà·Ä
      //ÀÌ ¸ðµ¨¿¡ ¿µÇâÀ» ¹ÌÄ¥ °ÍÀÌ´Ù¶ó´Â°É ¾Ë·Á ÁÖ´Â °ÍÀÌ´Ù.
   //GL_MODELVIEW :Çà·Ä ¿¬»êÀÌ ¸ðµ¨ °üÃø ½ºÅÿ¡ Àû¿ëµÈ´Ù.(Àå¸é »ó¿¡¼­ ¹°Ã¼¸¦ À̵¿ÇÒ ¶§ »ç¿ë)
   //GL_PROJECTION :Çà·Ä ¿¬»êÀÌ Åõ¿µ Çà·Ä ½ºÅÿ¡ Àû¿ëµÈ´Ù.(Ŭ¸®ÇÎ °ø°£À» Á¤ÀÇÇÒ ¶§ »ç¿ë)
   //GL_TEXTURE :Çà·Ä ¿¬»êÀÌ ÅØ½ºÃÄ Çà·Ä ½ºÅÿ¡ Àû¿ëµÈ´Ù.(ÅØ½ºÃÄ ÁÂÇ¥¸¦ Á¶ÀÛ)
}

void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

 

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   
glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
   glMatrixMode (GL_MODELVIEW);
}

glFrustum()Àº ¿øÇÏ´Â È¿°ú¸¦ ¾ò±â À§ÇØ Åõ¿µ ¹æ¹ýÀ» Á÷°üÀûÀ¸·Î ÆÄ¾ÇÇϱâ Èûµé´Ù. ÇÏÁö¸¸ gluPerspective()´Â Á÷°üÀûÀ¸·Î
½¬¿î ÆíÀÌ´Ù.

 void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far);

 void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
  
 gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 30000.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

 ±×·³ ¶Ç ³ª¿À°Ô µÈ Ŭ¸®ÇÎÀ̶ó´Â ¿ë¾î¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¾´Ï´Ù.

 À©µµ¿ì´Â ¹°¸®ÀûÀ¸·Î Çȼ¿´ÜÀ§·Î ¸ð´ÏÅÍ¿¡ »Ñ·ÁÁà¾ß Çϱ⠶§¹®¿¡ ÇÁ·Î±×·¥¿¡°Ô Ŭ¸®ÇÎ °ø°£À» °¡¸£ÄÑ ÁÖ¾î¾ß ÇÑ´Ù.
 2D¿Í´Â ´Ù¸£°Ô Ŭ¸®ÇÎÀÌ¶ó±¸ Çϸé Ãß°¡µÇ´Â ³»¿ëÀÌ ºäÆ÷Æ®¿ÍÀÇ ¿¬°ü¼º¿¡ ´ëÇÑ ÀÌÇØ°¡ ÇÊ¿äÇÏ´Ù.

 ½±°Ô À©µµ¿ìÀÇ Å©±â¸¦ Á¶ÀýÇÑ´Ù±¸ °¡Á¤À» ÇÏÀÚ. Ŭ¸®ÇÎ °ø°£¼³Á¤Àº ¿ì¸®°¡ ¿øÇÏ´Â 150x100ÀÇ ÁÂÇ¥°è°¡ ½ÇÁ¦ ½ºÅ©¸°ÀÇ
 ³ôÀÌ¿Í °°°Ô ¼³Á¤À» ÇØÁÖ´Â °ÍÀÌ´Ù. ÀÌ ¹æ¹ý¿¡´Â À§ÀÇ Åõ¿µÀÇ 3°¡Áö ¹æ¹ýÀÌ »ç¿ëÀÌ µÈ´Ù. Á÷±³ Åõ¿µÀ» »ç¿ëÀ» ÇÏ¸é ´ç¿¬È÷
 °°ÀºÅ©±âÀÇ ¹°Ã¼°¡ Ç×»ó º¸À̰ÚÁÒ..

 ±×·¯±¸ ºäÆ÷Æ®°¡ Ãà¼Ò È®´ëÀÔ´Ï´Ù. ºäÆ÷Æ®ÀÇ Å©±â¸¦ Ãà¼Ò¸¦ ½Ã۸é À©µµ¿ìÀÇ ½ºÅ©¸°ÀÇ °¡·Î,¼¼·Î°ªÀÌ µé¾î°¡¼­ Ãà¼Ò°¡ µÇ´Â
 °Ì´Ï´Ù.

 

 

 

3.Ŭ¸®ÇÎ ÁÂÇ¥´Â wÁÂÇ¥·Î ³ª´©¾î Á¤±ÔÈ­ ÀåÄ¡ ÁÂÇ¥°è·Î º¯È¯ÀÌ µÈ´Ù.
  -->À̶§ w°ªÀº »ç¿ëµÈ º¯È¯¿¡ µû¶ó Åõ¿µ Çà·ÄÀ̳ª ¸ðµ¨ °üÃø Çà·Ä¿¡ ÀÇÇØ º¯°æ µÉ ¼ö ÀÖ´Ù.

  Å¬¸®ÇÎ ÁÂÇ¥´Â ´Ù½Ã wÁÂÇ¥·Î ³ª´©¾î Á¤±ÔÈ­ ÀåÄ¡ ÁÂÇ¥°è·Î º¯È¯µÈ´Ù. À̶§ »ç¿ëµÈ w °ªÀº »ç¿ëµÈ º¯È¯¿¡ µû¶ó Åõ¿µÇà·ÄÀÌ
  ³ª ¸ðµ¨ °üÃø Çà·Ä¿¡ ÀÇÇØ º¯°æµÉ ¼ö ÀÖ´Ù.

4.ÀÌ ¼¼ °ªÀÇ ÁÂÇ¥´Â ºäÆ÷Æ® º¯È¯¿¡ ÀÇÇØ 2Â÷¿ø Æò¸éÀ¸·Î ¸ÅÇεȴÙ.

  glViewportÇÔ¼ö´Â ¸¹ÀÌ º¸¾ÒÀ» °ÍÀÌ´Ù.

 

´ÙÀ½À¸·Î ¾Ë¾Æ º¸´Â ³»¿ëÀº Æú¸®°ïÀÇ »ý¼º ¹æ¹ýµé¿¡ ´ëÇØ¼­ ÀÚ¼¼È÷ ¾Ë¾Æ º¸µµ·Ï ÇÑ´Ù.

 3Â÷¿ø °ø°£À» Ç¥ÇöÀ» Çϴµ¥ °¡Àå ±âº»ÀÌ µÇ´Â °ÍÀº Á¡ÀÌ¶ó±¸ ÇÏ¿´´Ù. ±×¸®±¸ ¼± ±×¸®±¸ ÇѸéÀ» ¸¸µå´Âµ¥´Â Æú¸®°ïÀ̶ó±¸
 ºÒ¸®´Â ¸éÀ» ±¸¼ºÇÏ´Â ÃÖ¼Ò ´ÜÀ§ÀÎ »ï°¢ÇüÀ¸·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. ±×·³ ÀÌ ¸»¿¡¼­µÎ ¾Ë ¼ö ÀÖµíÀÌ »ï°¢Çü Áï ÃÖ¼ÒÀÇ Æú¸®°ïÀ»
 ¸¸µé±â À§Çؼ­´Â Á¤Á¡ÀÌ 3°³´Â ÇÊ¿äÇÏ°Ô µÈ´Ù. ±×·³ ÀÌ ÀÌ·ÐÀ» ¹ÙÅÁÀ¸·Î ¶óÀο¡¼­ºÎÅÍ »ï°¢Çü ±× ÀÌ»óÀ¸·Î º¹ÀâÇÑ Æú¸®°ïÀ»
 ¾î¶»°Ô ±¸¼ºÀ» ÇÏ°í ±×¸®±¸ °¡Àå ÀûÀº ¸Þ¸ð¸® »ç¿ëÀ» Çϱâ À§Çؼ­ OpenGLÀº ¾î¶»°Ô ±¸ÇöÀ» ÇÏ´ÂÁö ¾Ë¾Æ º»´Ù.

glBegin(GL_LINE_STRIP);
  glVertex3f(0.0f, 0.0f, 0.0f);       //V0
  glVertex3f(50.0f, 50.0f, 0.0f);    //V1
  glVertex3f(50.0f, 100.0f, 0.0f);  //V2
glEnd();

¿·ÀÇ ¼±À» ±¸¼ºÇÏ´Â ÇÔ¼ö´Â GL_LINE_LOOP¸¦ »ç¿ëÇϱ¸ ³¡¿¡ ³ª¿À´Â ¼±Àº óÀ½ ¸í½ÃµÈ Á¤Á¡°ú ¸¶Áö¸·¿¡ ¸í½ÃµÈ Á¤Á¡ »çÀ̸¦
¿¬°áÇÏ°Ô µÇ¾î ´ÝÇô ÀÖ´Â ÇüÅÂÀÇ ¼±À» ½±°Ô ±×¸± ¼ö ÀÖ°Ô ÇØÁØ´Ù.

´ëÃæ ¼±À» ±ß´Âµ¥´Â ÀÌ·± µÎ°¡Áö ¹æ¹ýÀ¸·Î ÇÒ ¼ö°¡ ÀÖ´Ù. ±×·¯¸é ÀÌ ¼±µéÀ» °¡Áö°í ±¸¼ºµÇ´Â »ï°¢ÇüÀº ¾î¶² ¹æ¹ýµé·Î ±×¸®°Ô
µÇ´ÂÁö ¾Ë¾Æ º¸µµ·Ï ÇÑ´Ù.

»ï°¢ÇüÀ» ±×¸®´Âµ¥´Â °¨±â(Winding)¿¡ µû¶ó¼­ ¾Õ¸é,µÚ¸éÀ» ±¸ºÐÇÏ°Ô µÈ´Ù.

glBegin(GL_TRIANGLES);
  glVertex2f(0.0f, 0.0f);
  glVertex2f(25.0f, 25.0f);
  glVertex2f(50.0f, 0.0f);    //ÀÌ ºÎºÐÀº ¿À¸¥ÂÊÀÇ »ï°¢ÇüÀ» ±¸¼ºÇÑ´Ù.

  glVertex2f(-50.0f, 0.0f);
  glVertex2f(-75.0f, 50.0f);
  glVertex2f(-25.0f, 0.0f);  //Áö±Ý ÀÌ ºÎºÐÀº º¸¸é ¿ÞÂÊ »ï°¢ÇüÀÌ ¾Æ´Ï±¸ ¹Ý´ë·Î Áï ½Ã°è¹æÇâÀ¸·Î À̵¿ÇÑ´Ù.
                                    //±×·³ ÀÌ ºÎºÐµµ ÀÌ ÁÂÇ¥´ë·Î¸¸ »ï°¢ÇüÀ» ±×¸°´Ù¸é ¾Õ¸éÀÌ µÈ´Ù.
glEnd();

±×·³ ÀÌ·¸°Ô Áö±Ý º¸¿©ÁÖ±¸ ÀÖ´Â Æú¸®°ïÀÌ ¾Õ¸éÀÎÁö µÞ¸éÀÎÁö¸¦ ±¸ºÐÇÏ´Â ÀÌÀ¯°¡ ¹«¾ùÀϱî?

¸¹Àº ÀÌÀ¯°¡ ÀÖ´Ù. ¾ÕµÚ¸éÀÌ ¼­·Î ´Ù¸¥ ÀçÁúÀÇ Æú¸®°ïÀÌ ÇÊ¿äÇÒ ¶§µÎ ÀÖ±¸.
µÞ¸éÀ» ±×³É °¨Ãâ ¼öµµ ÀÖ±¸,ÀÏÁ¤ÇÑ »öÀ» ¼³Á¤ÇÏ¿© ¹Ý»ç ¼ºÁúÀ» ³ªÅ¸³¾ ¼öµµ ÀÖ´Ù.
±×¸®±¸ ·£´õ¸µ ¼Óµµ¸¦ °áÁ¤ÇÏ´Â Áß¿äÇÑ ¿ä¼Ò°¡ µÇ±âµµ ÇÑ´Ù.

glFrontFace(GL_CW) ÀÌ ÇÔ¼ö´Â ½Ã°è¹æÇâ °¨±â¸¦ »ç¿ëÇÑ Æú¸®°ïÀÌ ¾Õ¸éÀ» ÇâÇÑ´Ù´Â °ÍÀ» OpenGL¿¡°Ô ¾Ë·ÁÁÖ´Â °ÍÀÌ´Ù.
À§¿Í °°ÀÌ ±×³É ½Ã°è¹æÇâÀÌ¸é ¾Õ¸éÀ̱¸ ¹Ý½Ã°è¹æÇâ °¨±âÀÌ¸é µÞ¸éÀ̸é ÁÁÀºµ¥ ±×·¸Áö ¾Ê´Â °æ¿ì¿¡ ¾Ë·ÁÁÖ´Â °ÍÀÌ´Ù.

±×·³ ´Ù¸¥ °æ¿ì¸¦ ¾Ë¾Æ º»´Ù.

Æ®¶óÀÌ ¾Þ±Û ½ºÆ®¸³(Triangle Strips,»ï°¢¶ì)¶ó±¸ Çϴµ¥ ÀÌ ¹æ¹ýÀº óÀ½ ¼¼ Á¤Á¡À» ÁöÁ¤ÇÏ¿© ù ¹øÂ° »ï°¢ÇüÀ» ³ªÅ¸³½ ÈÄ,
±× ´ÙÀ½¿¡ ³ª¿À´Â »ï°¢ÇüÀ» ±×¸®±â À§Çؼ­´Â ´Ü ÇϳªÀÇ Á¡¸¸ ÀÖÀ¸¸é µÈ´Ù. ÀÌ·¯¸é »ó´ç ºÎºÐÀÇ ÇÁ·Î±×·¥ ÄÚµå¿Í ÀúÀå °ø°£À»
Àý¾àÇÒ ¼ö ÀÖ´Ù.ÀÌ°Ç ¾Õ¿¡¼­ ÇÏ´ø½ÄÀ¸·Î ¹Ý½Ã°è¹æÇâ °¨±â¸¦ Çϰí ÀÖ½À´Ï´Ù.

 
Æ®¶óÀÌ ¾Þ±Û ÆÒ(Triangle Fans,ºÎä²Ã) ÀÌ ¹æ¹ýÀº ½Ã°è¹æÇâÀ¸·Î µ¹¾Æ°£´Ù´Â°Ô ´Ù¸£´Ù.

ÀÌ ¸ðµç ºÎºÐ¿¡ ´ëÇÑ ¼Ò½º´Â ³ªÁß¿¡ ÇϳªÀÇ ¿¹Á¦¸¦ ÅëÇØ ¾Ë¾Æ º¸µµ·Ï ÇÑ´Ù.

´ÙÀ½À¸·Î Áß¿äÇÑ ¿ë¾î°¡ Àº¸éÁ¦°Å(Hidden Surface Removal)ÀÌ´Ù. ½±°Ô ÀÌ·± ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. óÀ½ ¹°Ã¼¸¦ ±×·È´Âµ¥
±×¸®±¸ ³ª¼­ ´Ù¸¥ ¹°Ã¼´Â ´õ ¾Õ¿¡ À§Ä¡ÇÑ ¹°Ã¼·Î Ç¥ÇöÀ» Çߴµ¥µÎ ¿©ÀüÈ÷ óÀ½ ¹°Ã¼°¡ µÚÀÇ ¹°Ã¼¸¦ °¡¸°´Ù´Â °ÍÀÌ´Ù.

ÀÌ ¹®Á¦¸¦ º¸¿ÏÇϱâ À§Çؼ­´Â z¹öÆÛ(±íÀÌ °Ë»ç)¶ó´Â°É ¼öÇàÀ» ÇÏ¿© °üÃøÀڷκÎÅÍ ¹°Ã¼°¡ ¾ó¸¶ÀÇ zÃàÀÇ À½ÀÇ ¹æÇâÀ»
ÇâÇÏ´ÂÁö ¾Ë¾Æ º¸¸é µÈ´Ù.
ÀÌ°É ¼öÇàÇÏ´Â ÇÔ¼ö´Â glEnable(GL_DEPTH_TEST)ÀÌ´Ù.

´ÙÀ½À¸·Î ³ª¿À´Â ¿ë¾î°¡ ¼±º°(culling)ÀÌ´Ù. ½±°Ô ¸éÀ» ¼û±â´Â °ÍÀÌ´Ù.

»çº¯Çü(Quad)¸¦ ±¸¼ºÇÏ´Â ÇÔ¼ö GL_QUAD_STRIP()

¹ü¿ë Æú¸®°ï(General Polygon)

Áö±ÝºÎÅÍ ¼Ò½º´Â À©»ÔÀ» ±×¸®´Â ¼Ò½ºÀÌ´Ù. »ö±òÀÌ ´Ù¸¥ µÎ ºÎºÐÀÌ Àִµ¥ À§¿¡°ÍÀÌ ¿ø»ÔÀ» ±¸¼ºÇÏ´Â ¿·¸éÀ» ¸¸µé±¸ ¾Æ·¡°¡
¿ø»ÔÀ» ±¸¼ºÇÏ´Â ¹Ø¸éÀ» ¸¸µé¾î ÁØ´Ù. Ç×»ó Â÷·Ê°¡ ÀÌ·¸´Ù. ³»°¡ ±¸ÇöÇÒ·Á±¸ ÇÏ´Â RC¸¦ ¹Ì¸® ¼³Á¤ÇØ ³õÀº ´ÙÀ½¿¡ ÁøÂ¥ ±×¸®´Â
ÇÔ¼ö¿¡´Â ¼±º°,±íÀÌ °Ë»ç,Æú¸®°ï ·£´õ¸µ µîÀÇ ¹æ¹ýµî¿¡ ´ëÇÑ ¸ðµç ºÎºÐÀ» ¼³Á¤À» ÇØÁØ´ÙÀ½¿¡ ¸ðµ¨ °üÃø Çà·ÄÀ» ´ÜÀ§Çà·Ä·Î
¹Ù²Ù¾îÁÖ´øÁö ´Ù¸¥ ¹æ¹ýÀ» ¾²´øÁö ÇØ¼­ ½Ã°¢ ÁÂÇ¥°è·Î º¯È¯À» ÇØÁÖ¾î¾ß ÇÑ´Ù. ±×·¯±¸ ¹°Ã¼¸¦ ¿òÁ÷ÀÌ´øÁö ÇÏ´Â ¹æ¹ý¿¡ À־
Çà·ÄÀ» »ç¿ëÇÑ´Ù. ±×¸®±¸ ÁøÂ¥ ¹°Ã¼¸¦ ±×¸®°Ô µÈ´Ù. ÀÌ ¹æ¹ýÀº Àü¿¡ ¹«½¼ º¯È¯À» ÇØ ÁÖ¾ú´ÂÁö¸¦ OpenGLÀÌ ¾Ë°í ÀÖ´Ù°¡ ´Ù¸¥
¹®Á¦°¡ ¹ß»ýÇÏÁö ¾Êµµ·Ï ÇØ ÁÖ´Â °ÍÀÌ´Ù.

void SetupRC() //±×·³ ·£´õ¸µ ÄÁÅØ½ºÆ®¸¦ ÃʱâÈ­ ÇØ º¸µµ·Ï ÇϰڴÙ.
{
        glClearColor(0.0f,0.0f,0.0f,1.0f); //Áö¿öÁö±¸ ´Ù½Ã ±×·ÁÁö´Â »ö
        glColor3f(0.0f,1.0f,0.0f); //ÇöÀç»ö

        glShadeModel(GL_FLAT); //¸¶Áö¸·À¸·Î ¸í½ÃµÈ Á¤Á¡¿¡¼­ »ç¿ëÇÏ´Â »öÀ» »ç¿ëÇÏ¿© Æú¸®°ïÀ» ÀÏÁ¤ÇÏ°Ô »öÄ¥ÇϰÔ
                    //¸¸µç´Ù. ¹Ý´ë·Î GL_SMOOTH´Â °¢ Á¤Á¡¿¡ ¸í½ÃµÈ °ªÀ» ºÎµå·´°Ô ¿¬°á Çϵµ·Ï, µÎ Á¤Á¡¿¡ ´ëÇØ ¸í½ÃµÈ »öÀ»
                    //º¸°£(interpolate)ÇÏ°Ô ÇÑ´Ù. ½±°Ô GL_FLAT´Â ÇÑ»öÀ¸·Î GL_SMOOTH´Â °¢ Á¤Á¡ÀÇ »öÀÌ ¹øÁ®³ª°¡µíÀÌ....

        glFrontFace(GL_CW);//Æ®¶óÀÌ ¾Þ±Û ÆÒÀ» »ç¿ëÇÒ°Å´Ñ±î ½Ã°è¹æÇâÀ̱¸ Æ®¶óÀÌ ¾Þ±Û½ºÆ®¸³ÀÌ¸é ¹Ý½Ã°è¹æÇâ

}

void RenderScene(void) //Àå¸éÀ» ±×¸± ¶§ »ç¿ëÀ» ÇÑ´Ù.
{
        GLfloat x,y,angle; //ÁÂÇ¥°ª°ú °¢µµ ÀúÀå
        int iPivot = 1;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//À©µµ¿ì¿Í ±íÀÌ ¹öÆÛ¸¦ CLEARÇÑ´Ù.

        if(bCull) //¼±º°À» ¿øÇÏ´ÂÁö ¾ÊÇÏ´ÂÁö¸¦ ±¸ºÐ.
                glEnable(GL_CULL_FACE);
        else
                glDisable(GL_CULL_FACE);

        if(bDepth) //±íÀÌ °Ë»ç¸¦ Å×½ºÆ®
                glEnable(GL_DEPTH_TEST);
        else
                glDisable(GL_DEPTH_TEST);

        if(bOutline) //µÞ¸éÀÇ Æú¸®°ï¸¸ ±×¸®´ÂÁö ¼³Á¤
                glPolygonMode(GL_BACK,GL_LINE);
        else
                glPolygonMode(GL_BACK,GL_FILL);

        glPushMatrix(); //ÇöÀç Çà·ÄÀ» glLoadIdentity()·Î ÃʱâÈ­¸¦ ÇÏÁö ¾Ê°í ½ºÅÿ¡ ÀúÀåÇ϶ó´Â ÇÔ¼öÀÌ´Ù.
                     //ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¸ñÀûÀº ¸Å¹ø °üÃø Çà·ÄÀ» ´ÜÀ§ Çà·Ä·Î ÃʱâÈ­ÇÏ´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù. Áï ÇöÀç º¯È¯
                     //»óŸ¦ ÀúÀåÇÏ°í Æ¯Á¤ ¹°Ã¼¸¦ ÁöÁ¤ÇÑÈÄ ´Ù½Ã º¹±¸ÇÏ´Â ±â´ÉÀÌ ÇÊ¿äÇÒ ¶§´Â ÃʱâÈ­¸¦ ÇÏ°Ô µÇ¸é ´Ù½Ã º¯È¯
                     //µÈ Çà·ÄÀ» ´Ù½Ã ¹Ù²ã Áà¾ß ÇϹǷΠºñ È¿À²ÀûÀÌ´Ù.

        glRotatef(xRot,1.0f,0.0f,0.0f);
        glRotatef(yRot,0.0f,1.0f,0.0f); //¿©±â¼­ ȸÀüÀ» ½ÃŲ´Ù.

        glBegin(GL_TRIANGLE_FAN); //Æ®¶óÀÌ ¾Þ±Û ÆÒÀ» ±×¸®±â ½ÃÀÛÇÑ´Ù.

        glVertex3f(0.0f,0.0f,75.0f); //¿ø»ÔÀÇ ²ÀÁöÁ¡ ÁöÁ¤

        for(angle=0.0f; angle < (2.0f*GL_PI); angle +=(GL_PI/8.0f)) //¿øÀÇ Â¦¼ö¹øÂ°Á¡À» Æ®¶óÀÌ¾Þ±Û ÆÒÀÇ Á¤Á¡À¸·Î ¼³Á¤
        {
                x = 50.0f*sin(angle);
//Á¤Á¡ÀÇ X,Y°ªÀ» °è»ê
                y = 50.0f*cos(angle);

                if((iPivot %2) == 0) //Àû»ö°ú ³ì»öÀ» ¹ø°¥¾Æ°¡¸ç »ç¿ëÇÑ´Ù.
                        glColor3f(0.0f,1.0f,0.0f);
                else
                        glColor3f(1.0f,0.0f,0.0f);


                iPivot++;
//°ªÀ» Áõ°¡½ÃÄÑ ´Ù¸¥ »öÀ» Ä¥ÇÏ°Ô ¼³Á¤
                glVertex2f(x,y);
//Æ®¶óÀÌ ¾Þ±Û ÆÒ¿¡ »ç¿ëÇÒ Á¤Á¡À» »ç¿ëÇϱâ À§Çؼ­ Á¤Á¡ ÁöÁ¤
        }

        glEnd();

        glBegin(GL_TRIANGLE_FAN);//¹Ù´Ú ä¿ì±â

        glVertex2f(0.0f,0.0f); //Áß½ÉÀº ¿øÁ¡

        for(angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI/8.0f))
        {
                x=50.0f*sin(angle);
                y=50.0f*cos(angle);
 
                if((iPivot %2) == 0)
                        glColor3f(0.0f,1.0f,0.0f);
                else
                        glColor3f(1.0f,0.0f,0.0f);
                iPivot++;
                glVertex2f(x,y);
        }

        glEnd();

        glPopMatrix(); //½ºÅÿ¡ ÀúÀåµÈ Çà·ÄÀ» ´Ù½Ã ºÒ·¯³½´Ù.

        glFlush(); //µå·ÎÀ× ¸í·ÉÀ» ½ÇÇàÇÑ´Ù.
}

´ÙÀ½À¸·Î Æú¸®°ï¿¡ ÆÐÅÏÀ» Ã¤¿ì´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸ÀÚ.
µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ÅØ½ºÃÄ ¸ÅÇΰú Æú¸®°ï ½ºÆ¼Çøµ ÆÐÅÏ(polygon stippling pattern)ÀÌ ÀÖ´Ù.

ÅØ½ºÃÄ ¸ÅÇÎÀº Á¦°¡ ¾ÆÁ÷ ¸ð¸£´Ñ±î ¹¹¶ó ÇÒ¸»Àº ¾ø±¸ ½ºÆ¼Çøµ ÆÐÅÏÀº ´ÜÁö,ä¿ì±â ÆÐÅÏ¿¡ »ç¿ëµÇ´Â 32x32 ´Ü»ö ºñÆ®¸ÊÀ¸·Î
º¸¸é µÈ´Ù.
glEnable(GL_POLYGON_STIPPLE); //ÀÌÁ¦ºÎÅÍ Æú¸®°ï ½ºÆ¼Çøµ ÆÐÅÏÀ» »ç¿ëÇÑ´Ù´Â°É ¾Ë·ÁÁØ´Ù.
glPolygonStipple(pBitmap); //ÀÌÁ¦ ³ª¿À´Â ¸ðµç Æú¸®°ïÀº pBitmapÀ¸·Î ¸í½ÃµÈ ÆÐÅÏÀ» »ç¿ëÇÏ¿© ä¿öÁú °ÍÀÌ´Ù´Â°É ¾Ë·ÁÁÜ

 

ÀÌ ¸ð¾çÀ» ¸¸µé±â À§Çؼ­ Á¦ÀÏ ¹Ø¿¡¼­ºÎÅÍ ½ÃÀÛÇÏ¿© Çѹø¿¡ ÇÑÁÙ¾¿ ÀúÀåÇÏ´Â °ÍÀÌ´Ù. ÃÖ»óÀ§ ºñÆ®°¡ ¸ÕÀú ÀÐÇôÁö´Â ¹æ½ÄÀ¸·Î
±¸¼ºµÇ¾î À־,µ¥ÀÌÅ͸¦ ±âº»ÀûÀ¸·Î ÀúÀåµÈ ¼ø¼­´ë·Î ÀÐÀ» ¼ö ÀÖ´Ù. ±×¸®±¸ ³ª¼­ °¢ ¹ÙÀÌÆ®¸¦ ¿ÞÂÊ¿¡¼­ºÎÅÍ ¿À¸¥ÂÊÀ¸·Î
ÀÐÀº µÚ,4¹ÙÀÌÆ®¾¿ 32ÇàÀ» ´ã±â ÃæºÐÇÑ GLubyteÇüÀÇ ¹è¿­¿¡ ÀúÀåÇÑ´Ù.

GLubyte fire[] ={0x00,0x00,0x00,0x00,
                        ~~~~~~~~~~~~,
                        0x00,0x00,0x00,0xc0,
                        0x00,0x00,0x01,0xf0,
                        0x00,0x00,0x07,0xf0,
                        ¹¹ ÀÌ·±½ÄÀ¸·Î ºñÆ®¸¶´Ù¿¡ °ªÀ» ³Ñ¾î¼­ ÇϳªÀÇ ¸ð¾çÀ» ±¸¼ºÇÏ°Ô ÇÑ´Ù.

void SetupRC()
{
   glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
   glColor3f(1.0f, 0.0f, 0.0f);
   glEnable(GL_POLYGON_STIPPLE);
   glPolygonStipple(fire);
}

´ÙÀ½À¸·Î ³ª¿À´Â ³»¿ëÀÌ Æú¸®°ïÀÇ Á¦¾à¿¡ ´ëÇÑ ºÎºÐÀÔ´Ï´Ù.

ºÐÇÒ(Subdivision) °£¼±
 

´ÙÀ½À¸·Î Áß¿äÇÑ ºû¿¡ ´ëÇØ¼­ ¾Ë¾Æº»´Ù. ±×·³ ºû¿¡´Â ¾î¶² °ÍµéÀÌ ÀÖ´ÂÁö ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

Ambient Light(ÁÖº¯±¤)
ƯÁ¤ÇÑ ¹æÇâÀÌ¿¡¼­ ¿À´Â ºûÀÌ ¾Æ´Ï´Ù. ºûÀÇ ±Ù¿øÀº ÀÖÁö¸¸ ¹æ ȤÀº Àå¸é ÁÖÀ§¿¡¼­ ¹Ý»çµÇ¾î µé¾î¿À±â ¶§¹®¿¡ ¹æÇâÀÌ ¾ø´Â ±¤¼±ÀÌ´Ù. Ambient light¿¡ ÀÇÇØ¼­ Á¶¸íµÇ´Â ¹°Ã¼´Â ÀüüÀûÀ¸·Î ¸ðµç ¹æÇâÀ¸·ÎºÎÅÍ ºûÀÌ ºñÃß¾îÁø´Ù. ¹°Ã¼¸¦ ȸÀü½ÃÄѵµ Ambient Light¿¡ ÀÇÇØ¼­ »öÀÌ º¯ÇÏÁö ¾Ê´Â´Ù. Áï, ¹æÇâÀ» °®°í ÀÖÁö ¾ÊÀº Ambient Light°¡ ±× ¹°Ã¼¸¦ ºñÃß°í ÀÖ¾ú±â ¶§¹®¿¡, ¾î´À °¢µµ¿¡¼­µµ °°Àº »öÀ¸·Î º¸¿©Áö´Â °ÍÀÌ´Ù.

Diffuse Light(¹Ý»ç±¤)
ƯÁ¤ÇÑ ¹æÇâÀ¸·Î ºñÃçÁöÁö¸¸, ±× ºûÀÇ ¹Ý»ç´Â ¿©·¯ ¹æÇâÀ¸·Î ÀÌ·ç¾îÁø´Ù. ºûÀÌ °ñ°í·ç ¹Ý»çµÈ´Ù ÇÏ´õ¶óµµ, ¹°Ã¼¸¦ ºñ½ºµëÈ÷ ºñÃâ ¶§º¸´Ù ¹Ù·Î À§¿¡¼­ ºñÃâ ¶§°¡ ¹°Ã¼ Ç¥¸éÀ» ´õ ¹à°Ô º¸ÀδÙ. ¿¹·Î½á Çü±¤µîÀÇ ºûÀ̳ª ¿ÀÈÄ¿¡ âÀ» ÅëÇØ µé¾î¿À´Â ÇÞºûÀ» »ý°¢ÇÏ¸é µÈ´Ù.

Specular Light(È®»ê±¤)
¿ª½Ã ¹æÇâÀ» °¡Áö´Â ºûÀÌ´Ù. ÇÏÁö¸¸ »ç¹æÀ¸·Î “TÀ» ¹Ý»ç½ÃŰ´Â Diffuse Light¿Í´Â ´Þ¸® ƯÁ¤ ¹æÇâÀ¸·Î¸¸ ¶Ñ·ÇÇÏ°Ô ºûÀ» ¹Ý»ç½ÃŲ´Ù. °­ÇÑ Specular LightÀÌ ¹°Ã¼¿¡ ´êÀ¸¸é ±× Ç¥¸é¿¡ Spot°¡ »ý±â´Âµ¥ À̰ÍÀ» Specular Highlight¶ó°í ÇÑ´Ù.

 ÀÌ ºÎºÐÀº phongÀÇ ¹Ý»ç¸ðÇüÀ̶ó´Â °Ô Àִµ¥ ÀÌ°É ¼öÇÐÀû °ø½ÄÀ¸·Î ¾²°í ÇÏ´Â°Ç ¹«ÀÚ°Ô ¸Ó¸®°¡ ¾ÆÇÁ´Ù. ±»ÀÌ ¾Ë Çʿ伺µµ
 ÀüÇô ¾ø´Ù. ±×·³ ¿ì¸® ÁÖº¯ÀÇ ºûÀº ÀÌ·± Á¤µµ·Î ±¸¼ºÀÌ µÇ¾î ÀÖ´Ù´Â°É ¿Ü¿ì±¸ ³Ñ¾î °£´Ù.

Á¶¸íÀ» Àû¿ëÇÏ´Â ´Ü°è¸¦ ¿ì¼±¾Ë°í »ý°¢Çϸ鼭 ³Ñ¾î°¡µµ·Ï ÇÑ´Ù.

1.¸ðµç °´Ã¼ÀÇ ¸ðµç Á¤Á¡µé¿¡ ´ëÇØ ¹ý¼±µéÀ» °è»êÇÑ´Ù. ±× ¹ý¼±µéÀº ±¤¿ø¿¡ ´ëÇÑ °´Ã¼ÀÇ »ó´ëÀûÀÎ ¹æÇâÀ» °áÁ¤ÇÑ´Ù.
2.¸ðµç ±¤¿øµéÀ» »ý¼º,¼±ÅÃ,¹èÄ¡ÇÑ´Ù.
3.Á¶¸í ¸ðµ¨À» ¼±ÅÃÇÑ´Ù.Á¶¸í ¸ðµ¨Àº ÁÖº¯±¤ ¹× Á¶¸í °è»êÀ» À§ÇÑ ½ÃÁ¡ÀÇ À§Ä¡¸¦ °áÁ¤ÇÑ´Ù.
4.Àå¸é ¾ÈÀÇ °´Ã¼µé¿¡ ´ëÇÑ ÀçÁú ¼Ó¼ºÀ» Á¤ÀÇÇÑ´Ù.

ÁøÇàÀ» À§ÀÇ ´Ü°è¼øÀ¸·Î ÇÏÁø ¾Ê°Ú´Ù. óÀ½ºÎÅÍ ¹ý¼±ÀÌ ³ª¿À±¸ ÇÏ¸é ¸Ó¸®°¡ ¾ÆÇÁ±â ¶§¹®ÀÌ¿¡¿ä...

 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //ÀÌ°Ç À©µµ¿ì¸¦ Áö¿ï ¶§ ´Ù½Ã ¸»Çؼ­ ¹ÙÅÁ.
 glColor3f(1.0f, 0.0f, 0.0f); //ÀÌ°Ç Æú¸®°ïÀ̳ª ƯÁ¤ ¿µ¿ªÀÇ »ö ÁöÁ¤
 glColor3ub((GLubyte)0, (GLubyte)0, (GLubyte)255); //ÀÌ°Ç window RGB¸¦ »ç¿ëÀ» ¸¹ÀÌÇÑ ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ ÇÔ¼ö

´ÙÀ½À¸·Î »öÀ» ÁöÁ¤ÇÏ´Â ¹æ¹ýÀÌ Àִµ¥ ÀÌ´Â ½¦À̵ùÀÌ¶ó±¸ ÇÑ´Ù.
À§¿¡µÎ ³ª¿À°Ô µÇÁö¸¸ ½¦À̵ù¿¡´Â GL_FLAT¿Í GL_SMOOTH°¡ ÀÖ´Ù. ÀÌ ³»¿ëÀº À§¿¡ ³ª¿À´Ñ±î »ý·«ÇÑ´Ù.
±×¸®±¸ GL_POLYGONÀº GL_FLAT¿Í ´Þ¸® Æú¸®°ï ³»ºÎÀÇ Ã¹Á¤Á¡¿¡ ¼³Á¤µÈ »öÀ» Ä¥ÇÑ´Ù.

´ÙÀ½À¸·Î Áß¿äÇÑ °³³äÀÌ ¹°Ã¼°¡ °¡Áö°í ÀÖ´Â °íÀ¯ÇÑ ÀçÁú¿¡ µû¶ó¼­ »öÀÌ ´Þ¸® º¸Àδٴ°ÍÀÌ´Ù.
½±°Ô ƯÁ¤»öÀ» °¡Áø ¹°Ã¼´Â °°Àº ƯÁ¤»öÀ» ºñÃß°Ô µÇ¸é ±× »öÀº °ÅÀÇ ¹Ý»ç¸¦ ÇÏ°í ´Ù¸¥»öÀº Èí¼ö¸¦ ÇÑ´Ù´Â °ÍÀÌ´Ù.

°¡·É °¡Á¤ÇØ º¸ÀÚ.Æú¸®°ïÀÌ Àû»öÀÏ °æ¿ì,Æú¸®°ïÀÌ ºûÀÇ Àû»ö ¼ººÐÀ» ´ëºÎºÐ ¹Ý»çÇÏ´Â ÀçÁú·Î ÀÌ·ç¾îÁ® ÀÖ´Ù±¸ ¼³Á¤ÇÑ´Ù.
¹°Ã¼ÀÇ Ç¥¸éÀÌ Àû»öÀ» ³ªÅ¸³»µµ·Ï ¼³Á¤ÇÏ´Â °Í»Ó¸¸ ¾Æ´Ï¸¶ ÁÖº¯±¤,¹Ý»ç±¤,È®»ê±¤¿¡ ´ëÇÑ ÀçÁúÀÇ ¹Ý»ç ¼Ó¼ºµµ ÇÔ²² ¼³Á¤ÇØ
ÁÖ¾î¾ß ÇÑ´Ù. °¡·É ÀçÁúÀÌ ¹Ý¦À̴ Ư¼ºÀ» °¡Áö¸ç È®»ê±¤À» ÁÖ·Î ¹Ý»çÇÏ´Â ¹Ý¸é,´ëºÎºÐÀÇ ÁÖº¯±¤,¹Ý»ç±¤Àº Èí¼öÇÏ´Ù°í ¼³Á¤
ÇÒ ¼ö ÀÖ´Ù. ÀÌ¿Í ¹Ý´ë·Î ÆòÆòÇϰí, »öÀ» ¶ì°í ÀÖ´Â ¹°Ã¼¸¦ ¸ðµç È®»ê±¤Àº Èí¼öÇÏ¿© ÁÖº¯ ȯ°æ¿¡ °ü°è¾øÀÌ ¹Ý¦ÀÌÁö ¾Êµµ·Ï
¼³Á¤ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ ¸ðµç ³»¿ëÀº OpenGL¿¡¼­ Áö¿øÀ» ÇÏ´Â ÇÔ¼öµéÀÌ ÀÖÀ¸´Ï Çѹø ¾Ë¾Æ º»´Ù..



        GLfloat ambientLight[] = { 0.25f, 0.25f, 0.0f, 1.0f };   // ÁÖº¯±¤¿¡ »ç¿ëÇÒ »öÁöÁ¤ ¾àÇÑ ³ë¶õ»ö
        GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.0f, 1.0f };        // ¹Ý»ç±¤ Á¶±Ý °­ÇÑ ³ë¶õ»ö
        GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };    //ºûÀ» Á¤¸éÀ¸·Î ¹ÞÀ» °æ¿ì ¼ø¹é»öÀ» ¶ì´Â°Ô º¸ÅëÀ̹ǷΠÇϾá»ö »ç¿ë
   
        glEnable(GL_LIGHTING);                //Á¶¸í È¿°ú ¿¬»êÀ» ¼öÇàÀº ÇÑ´Ù°í ¼³Á¤
        glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);  // ½ÇÁ¦ »ç¿ë
        glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);     // ½ÇÁ¦ »ç¿ë GL_LIGHT0À¸·Î »ç¿ëÇϰڴٱ¸ ¾Ë·ÁÁÜ
        glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
        glEnable(GL_LIGHT0);                   //GL_LIGHT0À» »ç¿ëÇϰڴٱ¸ ¾Ë·ÁÁÜ

        

±×·³ ÀçÁúÀº ÁöÁ¤ÇÏ´Â ÇÔ¼ö¸¦ ¾Ë¾Æº»´Ù. Ambient´Â ¹°Ã¼°¡ ÀºÀºÇÏ°Ô ³ªÅ¸³»´Â »öÀ̰í Diffuse´Â ¹°Ã¼ÀÇ ÁÖµÈ »ö»óÀÌ´Ù. SpecularÀº ¹°Ã¼°¡ ºû¿¡ Á¤¸éÀ¸·Î ºñÄ¥¶§ ³ªÅ¸³»´Â »öÀ̰í EmissonÀº Á¶±Ý ´Ù¸¥ °ÍÀ¸·Î ¹ß±¤»öÀÌ´Ù. Shiness´Â ºû³ª´Â Á¤µµ¸¦ ÀǹÌÇÑ´Ù. ¿©±âµÎ ¸¶Âù°¡Áö·Î »öÀ» ÁöÁ¤À» Çϰí ÇÔ¼ö¿¡ ±× »öÀ» ÁöÁ¤ÇÏ°í »ç¿ëÀ» ÇÏ¸é µÈ´Ù.

        GLfloat gray[] = {0.75f, 0.75f, 0.75f };
        GLfloat specular[] = {1.0f, 1.0f, 1.0f, 1.0f}
        GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };

        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray);
        glMaterialfv(GL_FRONT, GL_SPECULAR, specref);
        glMateriali(GL_FRONT, GL_SHININESS, 10);

GL_FRONT¶ó´Â ÀÎÀÚÀε¥ »ó¹ÝµÇ´Â ÀÎÀÚ·Î GL_BACKÀÌ´Ù. À̰ÍÀ» ÀÌ¿ëÇÏ¸é ¸éÀÇ ¾Õ¸é°ú µÞ¸éÀÇ ÀçÁúÀ» ¼­·Î ´Ù¸£°Ô ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. µÎ¸éÀ» µ¿½Ã¿¡ °°°Ô ¼³Á¤ÇÒ ¼ö ÀÖ´Â ÀÎÀÚ·Î GL_FRONT_AND_BACKÀÌ´Ù.
¹¹ ÀÌ·±½ÄÀ¸·Î ÀçÁúÀ» ÁöÁ¤ÇÑ´Ù.

´ÙÀ½À¸·Î ±¤¿ø(Light Source)°¡ ÇÊ¿äÇÏ´Ù. ½±°Ô ºûÀÌ ¾îµð¼­ ºñÃ߳Ŀ¡ µû¶ó¼­ ¹°Ã¼°¡ ºñÃß´Â ¸éÀÌ¸é ºûÀÌ ºñÃç¾ß Çϰí
¾Æ´Ï¸é °¢µµ¿¡ µû¶ó ºûÀÇ ¾çÀ̳ª ºñÃß´Â ¹æ¹ýÀ» ´Þ¸® ÇØ¾ß ÇÑ´Ù. ¿©±â¼­ ¿ì¸®´Â ¹ý¼± º¤ÅͶó´Â°É ¾Ë¾Æ¾ß ÇÑ´Ù.

½±°Ô ¹ý¼±Àº Ç¥¸éÀ¸·Î µé¾î¿À´Â ºûÀÇ °¢µµ¿Í Ç¥¸éÀ¸·ÎºÎÅÍ ³ª°¡´Â ºûÀÇ °¢µµ(Ç¥¸éÀÌ ¹Ý»çÇÏ´Â ºûÀÇ ¼¼±â)¸¦ °è»êÇϱâ À§ÇÑ
¼ö´ÜÀÌ´Ù.»ï°¢ÇüÀ» »ý°¢ÇØ º¸ÀÚ. Ç¥¸é¿¡ ÇϳªÀÇ ¹ý¼±º¤Å͸¦ °è»êÇØ¼­ »öÀ» Ä¥ÇØ ÁÖ´Â °Í°ú 3Á¤Á¡À» °è»êÇØ¼­ ´Ù·ç°Ô »öÀ»
Ä¥ÇØÁÖ´Â °ÍÀº ¸Å¿ì ´Ù¸¦ °ÍÀÌ´Ù. ±×·³ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ¸¹Àº Æú¸®°ïÀ» °è»êÀ» ÇÏ·Á¸é ±× ¸¹Àº Á¤Á¡µéÀ» ´Ù ¹ý¼±º¤Å͸¦ °è»ê
ÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù. À̸¦ È¿°úÀûÀ¸·Î »ç¿ëÇϱâ À§ÇÑ OpenGLÀÇ ÇÔ¼öµéÀ» ¾Ë¾Æ º¸µµ·Ï ÇϰڴÙ.

¹ý¼±º¤Å͸¦ ±¸ÇÒ·Á¸é ¿ì¼± µÎ º¤ÅÍÀÇ ¿ÜÀû(µÎ º¤ÅÍ¿¡ ¼öÁ÷ÀÎ º¤ÅÍ)¸¦ ±¸ÇÏ¸é µÈ´Ù. ±×·³ Æú¸®°ïÀ» ±¸¼ºÇÏ´Â ÃÖ¼Ò ´ÜÀ§ÀÇ »ï°¢
Çü¿¡¼­ ¹ý¼± º¤Å͸¦ ±¸ÇÒ·Á¸é ¼¼ Á¡À» ¾ËµçÁö ¾Æ´Ï¸é µÎ º¤Å͸¦ ¾Ë¸é µÈ´Ù. ±×·¯¸é low-level°ú high-levelÀ» ¾Ë¾Æ º¸ÀÚ.

void CrossProduct(float point1[3], float point2[3],float point3[3], float normal[3])
{
   float vector1[3], vector2[3];
   //¿ÜÀûÀ» ±¸Çϴµ¥ ÇÊ¿äÇÑ ¼¼ Á¤Á¡À¸·Î µÎ º¤Å͸¦ ¸¸µç´Ù.
   vector1[0] = point1[0] point2[0];
   vector1[1] = point1[1] point2[2];
   vector1[1] = point1[1] point2[2];

   vector2[0] = point2[0] point3[0];
   vector2[1] = point2[1] point3[2];
   vector2[1] = point2[1] point3[2];

    //µÎ º¤ÅÍÀÇ ¿ÜÀûÀ» ±¸ÇÏ¿© normal[]¿¡ ÀúÀå
   normal[0] = vector1[1]*vector2[2] vector1[2]*vector2[2];
   normal[1] = vector1[2]*vector2[0] vector1[0]*vector2[2];
   normal[2] = vector1[0]*vector2[1] vector1[1]*vector2[0];
}    //¼¼ Á¤Á¡¸¸ ¾Æ´Â °æ¿ì

void CrossProduct(float vector1[3], float vector2[3], float normal[3])
{
   normal[0] = vector1[1]*vector2[2] vector1[2]*vector2[2];
   normal[1] = vector1[2]*vector2[0] vector1[0]*vector2[2];
   normal[2] = vector1[0]*vector2[1] vector1[1]*vector2[0];
} //µÎ º¤Å͸¦ ¾Æ´Â °æ¿ì

high-level ÇÔ¼ö¸¦ ¾Ë¾Æ º¸ÀÚ. glNormal3f()ÀÌ´Ù.

            glNormal3f(1.0f, 0.0f, 0.0f);   //ÀÌ ¸éÀº xÃàÀÇ ¾çÀÇ ¹æÇâÀ¸·Î 1ÀÇ Å©±â¸¦ °®´Â ¹ý¼± º¤ÅÍÀÌ´Ù.
                glVertex3f(1.0f, 1.0f, 1.0f);
                glVertex3f(1.0f, -1.0f, 1.0f);
                glVertex3f(1.0f, -1.0f, -1.0f);
                glVertex3f(1.0f, 1.0f, -1.0f); //»ç°¢ÇüÀÇ Æú¸®°ïÀ» ¸¸µå´Âµ¥ +xÃà ¹æÇâÀ¸·Î ÇØ¼­ ½Ã°è¹æÇâÀ¸·Î ȸÀüÇÒ°ÍÀÌ´Ù.

OpenGLÀº ¹ý¼±À» Ç×»ó ´ÜÀ§ ¹ý¼±À¸·Î º¯È¯Çؼ­ °è»êÀ» ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â glEnable(GL_NORMALIZE)°¡ Àִµ¥ ¼º´É»ó
¹®Á¦¸¦ ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. ±×·¡¼­ GL_RESCALE_NORMALÀÌ Àִµ¥ À̰ÍÀº ¸ðµ¨ºä Çà·Ä¿¡ ÀÇÇØ °áÁ¤µÈ È®´ë,Ãà¼Ò ºñÀ²ÀÌ
¹ý¼±ÀÇ °¢ ¼ººÐ¿¡ ÀϰýÀûÀ¸·Î °öÇØÁø´Ù. ¾Æ´Ï¸é Á÷Á¢ low-levelÂ÷¿øÀ¸·Î ÇÔ¼ö¸¦ ¸¸µé¾îµÎ µÈ´Ù.

double VectorLength(float vector[3])
{
    return sqrt((vector[0]*vector[0]) +(vector[1]*vector[1]) + (vector[2]*vector[2]));
} //º¤ÅÍÀÇ ±æÀÌ ±¸Çϱâ

void Normalize(float normalVector[3])
{
    double length;
    length = VectorLength(normalVector);

    for ( int idx =0; idx < 3; idx++)
        normalVector[idx] /= length;
}  //º¤Å͸¦ Á¤±ÔÈ­ÇÑ´Ù. ÀÌ·¸°Ô low-level·Î ÇÏ¸é ´õ ¼Óµµ°¡ ³ª¿Ã ¼öµµ ÀÖ´Ù.

±×·³ ¸¶Áö¸·À¸·Î ¼¼ Á¤Á¡¸¸ °¡Áö°í ´ÜÀ§ ¹ý¼±À» ¸¸µå´Â ÇÔ¼ö¸¦ Á¤ÀÇÇØ º¸ÀÚ.
void CalculateNormal (float point1[3], float point2[3], float point3[3], float normal[3])
{
   CrossProduct(point1,point2,point3,normal);
   Normalize(normal);
}           //¼Óµµ¸¦ ³ôÀÌ·Á¸é CrossProduct()¿Í Normalize()¸¦ Á÷Á¢ ¾È¿¡ Áý¾î ³Ö¾îÁÖ´Â°Ô ºü¸£°ÚÁÒ.

ÀÌ Á¤µµ¸é ¹ý¼±º¤Å͸¦ ±¸ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë ¼ö°¡ ÀÖ´Ù.

1.¸ðµç °´Ã¼ÀÇ ¸ðµç Á¤Á¡µé¿¡ ´ëÇØ ¹ý¼±µéÀ» °è»êÇÑ´Ù. ±× ¹ý¼±µéÀº ±¤¿ø¿¡ ´ëÇÑ °´Ã¼ÀÇ »ó´ëÀûÀÎ ¹æÇâÀ» °áÁ¤ÇÑ´Ù.
2.¸ðµç ±¤¿øµéÀ» »ý¼º,¼±ÅÃ,¹èÄ¡ÇÑ´Ù.
3.Á¶¸í ¸ðµ¨À» ¼±ÅÃÇÑ´Ù.Á¶¸í ¸ðµ¨Àº ÁÖº¯±¤ ¹× Á¶¸í °è»êÀ» À§ÇÑ ½ÃÁ¡ÀÇ À§Ä¡¸¦ °áÁ¤ÇÑ´Ù.
4.Àå¸é ¾ÈÀÇ °´Ã¼µé¿¡ ´ëÇÑ ÀçÁú ¼Ó¼ºÀ» Á¤ÀÇÇÑ´Ù.

±×·³ ´ëÃæ °³³äÀûÀ¸·Ð ºû¿¡ ´ëÇÑ Àü¹ÝÀûÀÎ ³»¿ëÀ» ÀÌÇØÇß´Ù±¸º¸¸é µÈ´Ù. ±âº»ÀûÀÎ ³»¿ëÀ¸·Î´Â ÀÌ Á¤µµ¸é ´Ù¸¥ ºÎºÐÀ» ÀÌÇØÇÏ
´Âµ¥µÎ ¹®Á¦°¡ ¾ø´Ù±¸ º¸±¸ ±×³É ÀÌÂë¿¡¼­ ºû¿¡ ´ëÇÑ Àü¹ÝÀûÀÎ ±âÃÊ ³»¿ëÀº ¸¶¹«¸®¸¦ ÇÑ´Ù.

 

´ÙÀ½À¸·Î Áß¿äÇÑ °³³äÀÎ ÅØ½ºÃÄ ¸ÅÇο¡ ´ëÇØ¼­ ¾Ë¾Æº¸ÀÚ.

¿ì¼± ÅØ½ºÃÄ ¸ÅÇÎÀ» ÇÒ·Á¸é À̹ÌÁöÆÄÀÏÀ» Çϳª ºÒ·¯ ¿Í¾ß Çϴµ¥ º¸Åë º¸¸é bmpÆÄÀÏÀ» ¸¹ÀÌ »ç¿ëÇϰí Ã¥¿¡ ¿¹Á¦°¡ ³ª¿ÍÀÖ±â
¶§¹®¿¡ bmp¸¦ ºÒ·¯ µéÀÌ´Â°É °øºÎÇÏ´Â°Ç ¹«ÀǹÌÇѰа°À¸¹Ç·Î tgaÆÄÀÏÀ» ºÒ·¯ µé¿©¼­ Çѹø ÅØ½ºÃÄ ¸ÅÇο¡ Àû¿ëÇØ º»´Ù.

TargaÀ̹ÌÁö ÆÄÀÏÀº ¾ËÆÄ ä³ÎÀÌ ÀÖÀ¸¹Ç·Î ÅØ½ºÃÄ·Î »ç¿ëÇϱⰡ ½±´Ù. tgaÆÄÀÏÀº ÆÄÀÏÇì´õºÎºÐ°ú ÆÄÀÏ µ¥ÀÌÅ͸¦ ¸Þ¸ð¸®¿¡
ÀÐ¾î µéÀÌ´Â ¹æ¹ýÀ» »ìÆì º»´Ù.TARGAFILEHEADER°ú TGAFILE±¸Á¶Ã¼ÀÇ ±¸Á¶¿¡ ´ëÇØ¼­ Çѹø º¸±¸ ³Ñ¾î°¡µµ·Ï...

int LoadTGAFile(char *filename, TGAFILE *tgaFile) //tgaÆÄÀÏÀ» Àо À̹ÌÁö µ¥ÀÌÅ͸¦ ¸Þ¸ð¸®¿¡ ÀúÀåÇÏ´Â ÇÔ¼ö
{
        FILE *filePtr;
        unsigned char  ucharBad;         // Àӽÿë unsigned char data
        short int           sintBad;              // Àӽÿë short int data
        long                imageSize;            // size of the TGA image
        int                   colorMode;    // 4 ¸é RGBA , 3 À̸é RGB
        long                imageIdx;             // Ä«¿îÆ® º¯¼ö
        unsigned char  colorSwap;                // B <-->R bmpÆÄÀϰú ¸¶Âù°¡Áö·Î 24ºñÆ®¿¡¼­´Â BGRÇüÅ·Πµ¥ÀÌÅͰ¡
                                                              //µé¾î°¡¾ß ÇÑ´Ù.(?)

        // open the TGA file
        filePtr = fopen(filename, "rb"); //rbÀб⠸ðµå´Â read+binaryÀÌ´Ù. ÀÌÁø ¾²±â ¸ðµå
        if (!filePtr)
                return 0;

        // óÀ½ µÎ ¹ÙÀÌÆ®´Â ÇÊ¿ä¾øÀ¸¹Ç·Î ³Ñ¾î°£´Ù.
        fread(&ucharBad, sizeof(unsigned char), 1, filePtr);
        fread(&ucharBad, sizeof(unsigned char), 1, filePtr);

        // À̹ÌÁö ŸÀÔÀ» Àд´Ù.
        fread(&tgaFile->imageTypeCode, sizeof(unsigned char), 1, filePtr);

 

        2 =>¾ÐÃàµÇÁö ¾Ê´Â RGBÀ̹ÌÁö                    3 =>¾ÐÃàµÇÁö ¾ÊÀº Èæ¹é À̹ÌÁö
        4 =>RLE(Run-Length Encoding)¹æ½ÄÀ¸·Î ¾ÐÃàµÈ RGBÀ̹ÌÁö            11 =>¾ÐÃàµÈ Èæ¹é À̹ÌÁö
        // 2¿Í 3ÀÏ ¶§¸¸ Àд´Ù.)
        if ((tgaFile->imageTypeCode != 2) && (tgaFile->imageTypeCode != 3))
        {
                fclose(filePtr);
                return 0;
        }


        // ºÒÇÊ¿äÇÑ 13¹ÙÀÌÆ®´Â °Ç³Ê ¶Ú´Ù.
        fread(&sintBad, sizeof(short int), 1, filePtr);
        fread(&sintBad, sizeof(short int), 1, filePtr);
        fread(&ucharBad, sizeof(unsigned char), 1, filePtr);
        fread(&sintBad, sizeof(short int), 1, filePtr);
        fread(&sintBad, sizeof(short int), 1, filePtr);

        // À̹ÌÁö ³Êºñ¿Í ³ôÀ̸¦ Àд´Ù.
        fread(&tgaFile->imageWidth, sizeof(short int), 1, filePtr);
        fread(&tgaFile->imageHeight, sizeof(short int), 1, filePtr);


        // À̹ÌÁö »ö»ó ºñÆ®¼ö¸¦ Àд´Ù.
        fread(&tgaFile->bitCount, sizeof(unsigned char), 1, filePtr);

        // ºÒÇÊ¿äÇÑ 1¹ÙÀÌÆ®¸¦ °Ç³Ê ¶Ú´Ù.
        fread(&ucharBad, sizeof(unsigned char), 1, filePtr);

        // colorMode -> 3 = BGR, 4 = BGRA
        colorMode = tgaFile->bitCount / 8;
        imageSize = tgaFile->imageWidth * tgaFile->imageHeight * colorMode;

        // À̹ÌÁö µ¥ÀÌÅ͸¦ ³ÖÀ» ¸Þ¸ð¸® ÇÒ´ç
        tgaFile->imageData = (unsigned char*)malloc(sizeof(unsigned char)*imageSize);

        // À̹ÌÁö µ¥ÀÌÅ͸¦ ÀÐ¾î µéÀ̱â
        fread(tgaFile->imageData, sizeof(unsigned char), imageSize, filePtr);

        // Opengl¿¡ ¸Â°Ô BGRÀ» RGB·Î ±³Ã¼ÇÑ´Ù.
        for (imageIdx = 0; imageIdx < imageSize; imageIdx += colorMode)
        {
                colorSwap = tgaFile->imageData[imageIdx];
                tgaFile->imageData[imageIdx] = tgaFile->imageData[imageIdx + 2];
                tgaFile->imageData[imageIdx + 2] = colorSwap;
        }

        // close the file
        fclose(filePtr);

        return 1;
}

TGAFILE *myTGA; //±¸Á¶Ã¼¸¦ °´Ã¼¸¦ »ý¼ºÇØ ÁÖ±¸..
void DrawBitmap(long width, long height, unsigned char* bitmapImage)
{
        glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
        glRasterPos2i(200,200);
        glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, bitmapImage);
}             // ÀÌ Á¤µµÇØÁÖ¸é µÈ´Ù.
myTGA = (TGAFILE*)malloc(sizeof(TGAFILE)); //¸Þ¸ð¸® °ø°£À» Àâ¾Æ ÁØ´Ù.
LoadTGAFile("test.tga", myTGA); //ÆÄÀÏ À̸§À» Áý¾î ³Ö¾î ÁØ´Ù.

±×·³ ÀÌÁ¦ tgaÀ̹ÌÁöµµ Áغñ°¡ µÇ¾î ÀÖÀ¸´Ï ÅØ½ºÃÄ ¸ÅÇÎÀÇ ¹æ¹ýµé¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸ÀÚ.
ÅØ½ºÃÄ¿¡´Â 1D,2D,3D°¡ ÀÖ´Ù. 1D´Â ³Êºñ¸¸ ÀÖ´Â ¼±ÀÌ´Ù. 3DÅØ½ºÃÄ´Â ¾ÆÁ÷Àº °ÅÀÇ »ç¿ëÀ» ÇÏÁö ¾ÊÁö¸¸ Çϵå¿þ¾îÀÇ ºü¸¥ ¼ºÀå
À¸·Î ³ªÁß¿¡´Â »ç¿ëÀ» ÇÏ°Ô µÉ °ÍÀÌ´Ù.
ÇÔ¼ö´Â
glTexImage1D(),glTexImage2D()°¡ ÀÖ´Ù. ÀÌ°Ç µÎ°¡Áö ¹æ¹ýÀÌ Àִµ¥ ¿©±â¼­ ´Ù·ç±â¿¡´Â ³Ê¹« ¸¹Àº ºÎºÐÀ» Â÷ÁöÇÒ
°Å °°¾Æ¼­ »ý·«À» ÇÑ´Ù.

±×³É °£´ÜÇÏ°Ô ¾î¶² ÇÔ¼öµéÀÌ ¾î¶² ±â´ÉÀ» ÇØ¼­ ¾î¶»°Ô Æú¸®°ï¿¡ À̹ÌÁö°¡ ¹ÙÀεùµÇ´ÂÁö¿¡ ´ëÇØ¼­ ¾Ë¾Æº»´Ù.

       glEnable(GL_TEXTURE_2D);                  //  2D ÅØ½ºÃĸµÀ» Çϰڴٱ¸ ¾Ë·ÁÁÜ

        // bmpÆÄÀÏÀ» ÀÐ¾î µéÀÓ
        
bitmapData = LoadBitmapFile("checker.bmp", &bitmapInfoHeader);

        glGenTextures(1, &texture);                  // ÅØ½ºÃݴü¸¦ »ý¼º½ÃŲ´Ù.
       
 glBindTexture(GL_TEXTURE_2D, texture);       // ÅØ½ºÃĸ¦ ¹ÙÀεùÇÑ´Ù.

        //1¹øÂ° ¸Å°³º¯¼ö =>ÅØ½ºÃĸµÀº 2D»ç¿ëÇϰڴÙ.
        //2¹øÂ° ¸Å°³º¯¼ö =>ÅØ½ºÃÄ ÇÊÅ͸µ(ÅØ½ºÃİ¡ ½ÇÁ¦ È­¸é¿¡ ¾î¶»°Ô ÀÔÇôÁúÁö¿¡ °áÁ¤Çϴ°Å)¿¡¼­ È®´ë(ÇϳªÀÇ ÅØ¼¿ÀÌ ÇÏ         //³ªÀÇ Çȼ¿º¸´Ù Å« ¿µ¿ª¿¡ ÀÔÇôÁö´Â °Í),Ãà¼Ò(¿©·¯°³ÀÇ ÅØ¼¿ÀÌ ÇϳªÀÇ Çȼ¿¿¡ ÀÔÇôÁö´Â°Å)°¡ ¼öÇàµÇµµ·Ï ¼³Á¤ÇØ ÁØ´Ù.
        //3¹øÂ° ¸Å°³º¯¼ö =>ÅØ½ºÃİ¡ ÀÔÇôÁú Çȼ¿µéÀÇ Áß¾Ó°ú °¡Àå °¡±î¿î ÅØ¼¿À» »ç¿ëÇÑ´Ù.
        
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

     // ÅØ½ºÃÄ À̹ÌÁö¸¦ ÀÐ¾î µéÀδÙ.
        
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapInfoHeader.biWidth,
                                 bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapData); 

        ÀÌ Á¤µµ ÇØÁØ´ÙÀ½¿¡ ÁøÂ¥ ±×¸²À» ±×¸®´Â ºÎºÐ¿¡
glTexCoord2f()ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸ð´ÏÅÍ ÁÂÇ¥°ª°ú À̹ÌÁöÀÇ ÁÂÇ¥°ªÀ»
        ¸ÂÃçÁÖ¸é µÈ´Ù.

glTexImage2D()¿Í glReadPixels()ÇÔ¼ö°¡ Àִµ¥ glReadPixels()´Â ÀßÀº ¸ð¸£°ÚÁö¸¸ ÁÂÇ¥°ª¿¡ ÀÏÀÏÀÌ ¸ÂÃß¾îÁÖÁø ¾ÊÀº°Å
°°Àºµ¥.....

´ÙÀ½À¸·Î ´ÙÁß ÅØ½ºÃĸµ¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸ÀÚ.

¸»±×´ë·Î µÎ °³ÀÇ ÅØ½ºÃÄ À̹ÌÁö¸¦ °ãÄ¡°Ô ÇÏ´Â °ÍÀÌ´Ù. ÀÌ ºÎºÐÀº ÇöÀç ½Ã½ºÅÛ¿¡¼­ Áö¿øÀÌ µÇ´ÂÁö¿¡ ´ëÇØ¼­ ¸ÕÀú È®ÀÎÀ» ÇÑ
´ÙÀ½¿¡ ±¸ÇöÀ» ÇØ¾ß ÇÑ´Ù. ½±°Ô ±×·¡ÇÈÄ«µå°¡ ÁÁ¾Æ¾ß ÇÒ ¼ö°¡ ÀÖ´Ù.

GL_EXTENSIONSÀÎÀÚ³ª gluCheckExtension()ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÇöÀçÀÇ ±×·¡ÇÈ Ä«µå°¡ GL_ARB_multitexture¶ó´Â È®Àå
À̸§ÀÌ Á¸Àç ÇÑ´Ù¸é ½Ã½ºÅÛÀÌ Áö¿øÀÌ µÈ´Ù´Â°É ¾Ë ¼ö°¡ ÀÖ´Ù. ¼ø¼­´Â ¾Æ·¡¿Í °°´Ù.

1.´ÙÁß ÅØ½ºÃĸµÀÇ Áö¿ø ¿©ºÎ¸¦ È®ÀÎ
2.È®Àå ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò´Â´Ù.(À©µµ¿ìÁîÇÁ·Î±×·¥ÀÇ °æ¿ì Çʼö)
3.ÅØ½ºÃÄ ´ÜÀ§µéÀ» ¼³Á¤
4.ÅØ½ºÃÄ ÁÂÇ¥µéÀ» ÁöÁ¤

±×·³ 1¹øÀº ´ëÃæ À§¿¡¼­ ÇѰű¸ ´ÙÀ½À¸·Î È®Àå ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ¾ò¾î¾ß ÇÑ´Ù .ÇÔ¼ö´Â wglGetProcAddress()ÀÌ´Ù.

glMultiTexCoordifARB(´ÙÁß ÅØ½ºÃĸµÀ» À§ÇÑ ÅØ½ºÃÄ ÁÂÇ¥µéÀ» ÁöÁ¤),glActiveARB(ÅØ½ºÃÄ ´ÜÀ§¸¦ ¼³Á¤)
glClientActiveTextureARB(Æ÷ÀÎÅÍ ¹è¿­ ¸í·ÉµéÀ» À§ÇÑ ÇöÀç ÅØ½ºÃÄ ´ÜÀ§¸¦ ¼³Á¤

3.ÅØ½ºÃÄ ´ÜÀ§µéÀ» ¼³Á¤ÇÏ´Â ºÎºÐ¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸ÀÚ. ÇöÀç ÅØ½ºÃÄ ´ÜÀ§´Â glActiveTextureARB()ÇÔ¼ö·Î ¼±ÅÃÇÑ´Ù.
   ±¸Çö ¹æ¹ýÀº ÀÏ´Ü µÎ °³ÀÇ ÅØ½ºÃĸ¦ ºÒ·¯ µéÀ̱¸ µÎ °³ÀÇ ÅØ½ºÃÄ °´Ã¼¸¦ ¸¸µé±¸ ÀÌ µÎ ÅØ½ºÃÄ °´Ã¼µéÀ» ´ÙÁß ÅØ½ºÃĸµÀ»
   À§ÇÑ µÎ °³ÀÇ ÅØ½ºÃÄ ´ÜÀ§µé·Î ¸¸µç´Ù.

4.ÅØ½ºÃÄ ÁÂÇ¥ÀÇ ÁöÁ¤.
   
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 0.0f);
   glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f); 
//À̰ǽÄÀ¸·Î µÎ °³ÀÇ ÅØ½ºÃĵéÀ» ÁöÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù.

´ÙÀ½À¸·Î ºí·»µù°ú ¾È°³ È¿°ú¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸µµ·Ï ÇϰڽÀ´Ï´Ù.

ºí·»µùÀÌ¶ó±¸ Çϸé ÀÌ¹Ì È­¸é»ó¿¡ ±×·ÁÁø Çȼ¿ÀÇ »ö°ú ÀÌÁ¦ ¹Ù·Î °°Àº À§Ä¡¿¡ ±×·ÁÁú Çȼ¿ÀÇ »öÀÇ Á¶ÇÕÇÏ´Â ¹æ½ÄÀÌ´Ù. ¾î¶²½ÄÀ¸·Î »ö»óÀ» Á¶ÇÕÇÏ´Â Áö´Â ¾ËÆÄ°ª°ú ºí·£µù ÇÔ¼ö¿¡ ÀÇÇØ Á¤ÇØÁø´Ù. Áö±Ý±îÁö »ö»óÀ» ÁöÁ¤ÇÏ´Â ¹æ½ÄÀ¸·Î GL_RGB¸¦ »ç¿ëÇß¾ú´Âµ¥ ¿©±â¿¡´Â ¾ËÆÄ°ªÀÌ ¾ø´Ù. ¾ËÆÄ°ªÀÇ Ãß°¡¸¦ À§ÇØ GL_RGBA¸¦ »ç¿ëÇÒ¼öÀÖ´Ù. ±×¸®°í ¾ËÆÄ°ªÀ» Æ÷ÇÔÇÑ »ö»óÀ» ÁöÁ¤Çϱâ À§ÇØ glColor3f ´ë½Å glColor4f¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

ºí·£µù °ø½ÄÀÌ Àִµ¥ ±×°Ç º°·ç Áß¿äÇÑ°Ô ¾Æ´Ñ°Å °°´Ù. ±×·³ ÄÚµù ºÎºÐÀ» Çѹø µû¶ó°¡ º¸µµ·Ï ÇϰڽÀ´Ï´Ù.

glEnable(GL_CULL_FACE); °ÅÀÇ ¸ðµç ºÎºÐ¿¡¼­ ¸éÀÇ ¾Õ¸é¸¸±×¸®±¸ µÞ¸éÀ» ±×¸®Áö ¸»¶ó´Â ÀÌ ÇÔ¼ö¸¦ »ç¿ëÀ» Çϴµ¥ ÀÌ·¯¸é
ºí·£µùÈ¿°ú¸¦ ±¸ÇöÀ» ÇÒ ¼ö°¡ ¾ø´Ù. ±×·¡¼­ Á¦°Å¸¦ ÇÑ´Ù. ½±°Ô ºí·»µùÀº ¾Õ¸é¿¡ Åõ¸íµµ¸¦ Á־ µÞ¸éÀÌ ºñÃß°Ô Çϱâ À§ÇÑ ¹æ
¹ýÀ̱⠶§¹®ÀÌ´Ù.

glEnable(GL_BLEND); //ºí·»µù ½ÃÀÛ
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); //ù¹øÂ° ÀÎÀÚÀÎ GL_SRC_ALPHA´Â ¿øº» Çȼ¿¿¡ ´ëÇÑ ºí·£µù °è¼ö¸¦ °è»êÇÏ´Â ¹æ½ÄÀε¥ ¿øº»Ä®¶ó¸¦ ¿øº» ¾ËÆÄ°ªÀ¸·Î °öÇÏ´Â °ÍÀÌ´Ù. ±×¸®°í µÎ¹øÂ° ÀÎÀÚ´Â ´ë»ó Çȼ¿¿¡ ´ëÇÑ ºí·£µù °è¼ö¸¦ °è»êÇÏ´Â ¹æ½ÄÀε¥ ´ë»ó Ä®¶ó¿¡ (1-¿øº» ¾ËÆÄ°ª)À» °öÇÑ´Ù. ÃÖÁ¾ÀûÀ¸·Î ÀÌ·¸°Ô ó¸®µÈ µÎ Çȼ¿°ªÀÌ ÇÕÇØÁ®¼­ ÃÖÁ¾ Çȼ¿°ªÀ¸·Î 󸮵Ǿî È­¸é»ó¿¡ ³ªÅ¸³ª°Ô µÈ´Ù.

´ÙÀ½À¸·Î ¾È°³¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸ÀÚ.

OpenGL¿¡¼­ Á¦°øÇÏ´Â ¾È°³ÀÇ Á¾·ù´Â 3°¡Áö°¡ Àִµ¥ »ç½Ç 2°¡Áö·Î ±¸ºÐµÈ´Ù. Çϳª´Â GL_EXP¿Í GL_EXP2ÀÌ°í ´Ù¸¥ Çϳª´Â GL_LINEARÀÌ´Ù. GL_EXP¿Í GL_EXP2´Â ¹Ðµµ¶ó´Â °ªÀ» ÀÌ¿ëÇØ¼­ È­¸é Àüü¿¡ ÁöÁ¤µÈ ¾È°³ÀÇ »öÀ¸·Î ¸¶Ä¡ ÀÚ¿íÇÑ ¿¬±â ¾È¿¡ ¹°Ã¼µéÀÌ ³õ¿©ÀÖ´Â µíÇÑ È¿°ú¸¦ ³½´Ù. GL_LINEARÀº ¾È°³°¡ ÀÌÁ¦ ¸· ½ÃÀ۵Ǵ ±íÀÌ¿Í ¾È°³°¡ ¿ÏÀüÇÏ°Ô µéÀÌ¿öÁ®¼­ ´õ ÀÌ»ó ¹°Ã¼°¡ º¸ÀÌÁö ¾ÊÀ» ±íÀ̸¦ ÁöÁ¤ÇÔÀ¸·Î½á »ç½Ç °¡Àå ½ÇÁ¦ÀûÀÎ ¾È°³ È¿°ú¸¦ ¿¬ÃâÇÒ ¼ö ÀÖ´Ù.

GLfloat fogColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };//¸ÕÀú ¾È°³ »ö ÁöÁ¤

glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //¹è°æ»öµµ ¾È°³»ö¿¡ ¸ÂÃá´Ù.

´ÙÀ½¿¡ initGL¿¡¼­ Ãß°¡ÇؾßÇÒ °ÍÀº ¾È°³¿¡ ´ëÇÑ ¼³Á¤°ªµéÀÌ´Ù. ´ÙÀ½ÀÇ Äڵ带 Ãß°¡ÇÏÀÚ.

    glFogi(GL_FOG_MODE, GL_LINEAR);     //
    glFogfv(GL_FOG_COLOR, fogColor);    // LINEAR¸ðµåÀÇ ¾È°³ »ö ÁöÁ¤
    glFogf(GL_FOG_DENSITY, 0.3f);       // ¾È°³ÀÇ ¹Ðµµ ÁöÁ¤.GL_EXP,GL_EXP2¸¸ »ç¿ë
    glHint(GL_FOG_HINT, GL_NICEST);     // ¸ÚÀÖ°Ô ÇØ´Þ¶ó±¸ ¿ä±¸
    glFogf(GL_FOG_START, 5.5f);         // LINEAR¿¡¼­¸¸ Àû¿ë ¾È°³°¡ º¸ÀÌ´Â Z°ª
    glFogf(GL_FOG_END, 7.0f);           // ¾È°³°¡ µéÀÌ¿öÁ®¼­ ¹°Ã¼°¡ º¸ÀÌÁö ¾Ê´Â Z°ª
    glEnable(GL_FOG);                   // ¾È°³ »ç¿ë

´ÙÀ½À¸·Î OpenGLÀÇ ¹öÆÛ¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸ÀÚ.

¹öÆÛ¶ó±¸ ÇÏ¸é º¸Åë µ¥ÀÌÅ͸¦ ÀÓ½ÃÀûÀ¸·Î ´ã¾Æ ³õ´Â ÀúÀå¼ÒÀÌ´Ù. ±×·¯¸é ÀϹÝÀûÀ¸·Î ¹öÆÛ¶ó´Â °³³ä°ú OpenGL¿¡¼­
»ç¿ëµÇ´Â ¹öÆÛÀÇ °³³ä¿¡ ´ëÇØ¼­ Ʋ¸°Á¡À» ¾Ë¾Æ º¸ÀÚ.

OpenGL¿¡¼­ ¹öÆÛ¶ó±¸ Çϸé ÀϹÝÀûÀ¸·Î »ö»ó ¹öÆÛ¸¦ ¶æÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ÇÏÁö¸¸ º¸Åë »ö»ó¹öÆÛ´Â È­¸é¿¡ ³ªÅ¸³¯
Çȼ¿µéÀÇ »ö»óµéÀ» ´ã´Â ÀúÀå¼ÒÀÌ´Ù. OpenGL¿¡¼­´Â »ö»ó¹öÆÛ´Â À©µµ¿ìÀÇ °¢ Çȼ¿¿¡ ´ëÇÑ RGBA¶Ç´Â »ö»ó »öÀÎ °ª
À» ´ã´Â´Ù. ½±°Ô OpenGL¿¡¼­´Â ¹öÆÛ´Â ¾Æ·¡ÀÇ ¹öÆÛµéÀ» ´õ °¡Áö´Â ÇÔÃàÀûÀÎ ÁýÇÕÀ» ÀǹÌÇÑ´Ù.
ÇÁ·¹ÀÓ ¹öÆÛ´Â ½Ã½ºÅÛÀÇ ¸ðµç ¹öÆÛµéÀ» ÅëĪÇÑ´Ù. ÇÏÁö¸¸ OpenGL¿¡¼­´Â ÇÁ·¹ÀÓ ¹öÆÛ´Â »ö»ó¹öÆÛ,±íÀ̹öÆÛ(z ¹öÆÛ
¶ó°íµµ ÇÑ´Ù.),½ºÅÙ½Ç ¹öÆÛ,´©Àû ¹öÆÛ·Î ±¸¼ºµÈ´Ù. ±×·¯¹Ç·Î ÀÌ ¸ðµç ¹öÆÛµéÀ» È¿°úÀûÀ¸·Î °ü¸®¸¦ Çϰí ÇÁ·Î±×·¡¹Ö
ÇØ¾ß ·£´õ¸µ ¼Óµµ¸¦ Çâ»ó ½Ãų ¼ö°¡ ÀÖ´Ù .

¾ÕÀÇ µÎ ¹öÆÛ´Â ±×·±´ë·Î ÇÔ¼ö³ª ÀϹÝÀûÀÎ ¹æ¹ýÀ» À§¿¡¼­ ¸ðµÎ ´Ù·é ÆíÀÌ´Ù. ÇÏÁö¸¸ ½ºÅÙ½Ç ¹öÆÛ¿Í ´©Àû ¹öÆÛ¿¡ °üÇØ
¼­´Â ´Ù·çÁö ¸øÇÑÆíÀÌ´Ù. ±×·¯¸é ÀÌÁ¦ºÎÅÍ ÀÌ ºÎºÐ¿¡ ´ëÇØ¼­ ´Ù·ç¾î º¸µµ·Ï ÇϰڴÙ.

¿ì¼± ½ºÅÙ½Ç ¹öÆÛ´Â z¹öÆÛ(±íÀÌ ¹öÆÛ)¿Í À¯»çÇÑ Á¡ÀÌ ¸¹ÀÌ ÀÖÁö¸¸ z¹öÆÛ·Î´Â ºÒ°¡´ÉÇÑ È¿°ú¸¦ ±¸ÇöÀ» ÇÑ´Ù.
¿¹¸¦ µé¾î¼­ â¹®À» ÅëÇØ¼­ ÁýÀÇ ³»ºÎ¸¦ º¼ ¼ö ÀÖ´Ù´Â °Í°ú ºñÇà ½Ã¹Ä·¹ÀÌ¼Ç ÇÁ·Î±×·¥¿¡¼­´Â ½ºÅÙ½Ç ¹öÆÛ¸¦ ÀÌ¿ëÇÏ
¿© ºñÇà±â Á¶Á¤¼®ÀÇ Ç³¼Ó°è³ª ÁöÆò¼± Ç¥½Ã±â¿Í °°Àº °è±âÆÇ ³»ºÎ¿¡ ´ëÇØ µå·ÎÀ× ¿¬»êÀ» Á¦ÇÑÇÒ ¼ö ÀÖ´Ù.
ÇÏÁö¸¸ °¡Àå Èï¹Ì·Î¿î ¿¹´Â ±×¸²ÀÚÀÌ´Ù. ±×·¡ÇÈ Ä«µå¿¡ µû¶ó ´Ù¸£°ÚÁö¸¸ ´ÙÁß ±¤¿ø¿¡ ÀÇÇÑ Â£°í ¿¶Àº ±×¸²ÀÚ¸¦ »ý¼º
ÇÒ ¼ö ÀÖ´Ù.

PIXELFORMATDESCRIPTORÀÇ cStencilBits = 2;¸¦ Çϸé 2ºñÆ®ÀÇ ½ºÅÙ½Ç ¹öÆÛ°¡ »ý±â´Â °ÍÀÌ´Ù.
glEnable(GL_STENCIL_TEST); //½ºÅÙ½Ç Å×½ºÆ®¸¦ Ȱ¼ºÈ­ ÇÑ´Ù.
glStencilFunc(GL_ALWAYS, 1, 1); //½ºÅÙ½Ç Å×½ºÆ®´Â Ç×»ó Åë°ú½Ã۱¸ ÂüÁ¶°ªÀº 1À̱¸ ¸¶½ºÅ©´Â 1·Î ¼³Á¤
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP); //½ºÅÙ½Ç ¹öÆÛ¿¡ Àû¿ëµÇ´Â ¹æ½ÄÁöÁ¤
//1.½ºÅÙ½Ç Å×½ºÆ®¸¦ Åë°úÇÏÁö ¸øÇßÀ» ¶§ Àû¿ëµÉ ÀÛ¿ëÀ» ÀǹÌ
//2.½ºÅÙ½Ç Å×½ºÆ®¸¦ Åë°úÇßÀ¸³ª ±íÀÌ Å×½ºÆ®´Â Åë°úÇÏÁö ¸øÇßÀ» ¶§ Àû¿ëµÉ ÀÛ¿ë ÀǹÌ
//3.½ºÅÙ½Ç ,±íÀÌ Å×½ºÆ®¸¦ ¸ðµÎ Åë°úÇßÀ» ¶§ Àû¿ëµÉ ÀÛ¿ë ÀǹÌ.

¸¶Áö¸·À¸·Î ´©Àû ¹öÆÛ´Â ÇϳªÀÇ ¹öÆÛ¿¡ Àå¸éµéÀ» ¿©·¯¹ø ·£´õ¸µÇÑ´Ù ±×·¯¸é °¢ ·£´õ¸µ¿¡¼­ »ý±ä Çȼ¿µéÀÌ ´©Àû ¹öÆÛ
¿¡ ´©ÀûµÈ´Ù. ±×·± ´ÙÀ½ ´©Àû ¹öÆÛÀÇ ³»¿ëÀ» »ö»ó ¹öÆÛ·Î ¿Å°Ü¼­ È­¸é¿¡ ³ªÅ¸³ªµµ·Ï Çϴµ¥,ÀÌ·¯ÇÑ °úÁ¤À» ÅëÇØ ¸ð¼Ç
ºí·¯(¿òÁ÷À̴µ¥ ¸ð¾çÀÌ ¶³¸®´Â°Å °°Àº È¿°ú ½±°Ô È£¶ûÀ̰¡ ´Þ·Á°¡´Âµ¥ ´Ù¸®°¡ ¿©·¯°³°¡ ¾àÇÏ°Ô º¸ÀÌ´Â È¿°ú)³ª
ÇʵåÀÇ ±íÀÌ È¿°ú, Àå¸é ÀüüÀÇ ¾ÈƼ¾ó¶óÀÌÀ̽Ì,ºÎµå·¯¿î ±×¸²ÀÚ µîÀÇ È¿°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
ÀÌ ºÎºÐÀº Çϵå¿þ¾î Áö¿øÀÌ ÀϹÝÈ­ µÇÁö ¾Ê´Â ÇÑ °ÔÀÓ¿¡¼­ »ç¿ëÇÏ´Â °Ç ÈûµçÀÏÀ̶ó±¸ÇÑ´Ù. ¾î¼¸é Áö±ÝÀº ±×·¸Áö ¾Ê
´Â ÁÙµµ Àß ¸ð¸£Áö¸¸....

ÀÌ»óÀ¸·Î ±×³É ±âº»ÀûÀÎ ¹æ¹ýµé¿¡ ´ëÇÑ ³»¿ëÀ» ¸¶¹«¸® ÇÏ·Á±¸ ÇÑ´Ù. ´ÙÀ½À¸·Î ¾Ë¾Æ µÎ¾î¾ß ÇÏ´Â °³³äÀÌ º¹ÀâÇÑ Æú¸®
°ïÀ» ±×¸®´Â ¹æ¹ý°ú °î¼±°ú °î¸éÀ» ±×¸®´Â ¹æ¹ý,SelectionÀε¥ ÀÌ°Ç ¾î¶² ƯÁ¤ Çȼ¿À» Ŭ¸¯ÇÏ¸é ¹«½¼ È¿°ú°¡ ³ª°Ô
ÇÏ´Â °ÍÀÌ´Ù. ÀÌ Á¤µµ¸é ¾î¶² º¹ÀâÇÑ ¾Ë°í¸®ÁòÀ» °¡Áö°í Àִ Ư¼öÈ¿°ú¶óµÎ ±¸ÇöÀ» Çϴµ¥´Â ¹®Á¦°¡ ¾øÀ» °ÍÀ¸·Î º»
´Ù.