DirectX Graphics ÇÁ·Î±×·¡¹Ö °¡ÀÌµå Æ©Å丮¾ó, »ùÇÃ, Åø, ÈùÆ® ÇÁ·Î±×·¡¹ÖÀÇ ÈùÆ® ÆÛÆ÷¸Õ½ºÀÇ ÃÖÀûÈ­   [¸ñÂ÷¿­¶÷] [ÁÖ¼Òº¹»ç] [½½·Ôºñ¿ì±â]
ÆÛÆ÷¸Õ½ºÀÇ ÃÖÀûÈ­
 
Microsoft DirectX 9.0

ÆÛÆ÷¸Õ½ºÀÇ ÃÖÀûÈ­


3D ±×·¡ÇȽº¸¦ »ç¿ëÇÏ´Â ¸®¾óŸÀÓ ¾ÖÇø®ÄÉÀ̼ÇÀÇ °³¹ßÀÚ¿¡°Ô ÀÖ¾î, ÆÛÆ÷¸Õ½ºÀÇ ÃÖÀûÈ­´Â °ü½É»çÀÇ 1 °³ÀÌ´Ù. ¿©±â¿¡¼­´Â, ÃÖ°íÀÇ ÆÛÆ÷¸Õ½º¸¦ ¾òÀ» ¼ö ÀÖ´Â Äڵ带 ±â¼úÇϱâ À§ÇÑ °¡ÀÌµå ¶óÀο¡ ´ëÇØ ¼³¸íÇÑ´Ù.

ÆÛÆ÷¸Õ½º¿¡ °üÇÑ ÀϹÝÀûÀÎ ÈùÆ®

´ÙÀ½¿¡ ³ªÅ¸³»´Â ÀϹÝÀûÀÎ °¡ÀÌµå ¶óÀο¡ µû¶ó, ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÆÛÆ÷¸Õ½º¸¦ Çâ»ó½Ã۸é ÁÁ´Ù.

µ¥ÀÌŸº£À̽º ¹× Äøµ(Culling)

Microsoft® Direct3D® °¡ ¶Ù¾î³­ ÆÛÆ÷¸Õ½º¸¦ ½ÇÇöÇϱâ À§ÇÑ ¿­¼è°¡ µÇ´Â °ÍÀº, ¿ùµå³»ÀÇ °³Ã¼¸¦ °ÅµÎ´Â ½Å·Ú¼º ÀÖ´Â µ¥ÀÌŸº£À̽º¸¦ ±¸ÃàÇÏ´Â °ÍÀÌ´Ù. À̰ÍÀº ·¡½ºÅÍÈ­³ª Çϵå¿þ¾îÀÇ °³¼±º¸´Ù Áß¿äÇÏ´Ù.

´Ù°¢ÇüÀÇ °³¼ö´Â, °ü¸®ÇÒ ¼ö ÀÖ´Â ¹üÀ§³»¿¡¼­ ÃÖ¼ÒÇÑÀ¸·Î ¾ïÁ¦ÇÒ Çʿ䰡 ÀÖ´Ù. ´Ù°¢ÇüÀÇ °³¼ö¸¦ ÁÙÀÌ·Á¸é , ÃÖÃʺÎÅÍ ±× °³¼ö°¡ Àû¾îµµ µÇ´Â °Í °°Àº ¸ðµ¨À» ±¸ÃàÇÑ´Ù. ´Ù°¢ÇüÀÇ Ãß°¡´Â, °³¹ß ´Ü°èÀÇ ÈĹÝÀ¸·Î, ÆÛÆ÷¸Õ½º¸¦ Èñ»ýÇÏÁö ¾Ê°í Ãß°¡ÇÒ ¼ö ÀÖ´Â °æ¿ì¿¡ ½Ç½ÃÇÑ´Ù. ÃÖ°í ¼ÓµµÀÇ ´Ù°¢ÇüÀº µå·ÎÀ×(Drawing) ÇÏÁö ¾Ê´Â ´Ù°¢ÇüÀÎ °ÍÀ» ÀØÁö ¾Ê´Â °Í.

±âº»µµÇüÀÇ ¹èġó¸®

½ÇÇà½Ã¿¡ ÃÖ°íÀÇ ·»´õ¸µ ÆÛÆ÷¸Õ½º¸¦ ¾òÀ¸·Á¸é , ±âº»µµÇü¸¦ ¹èġó¸® ÇØ, ·»´õ¸µ ½ºÅ×ÀÌÆ®ÀÇ º¯°æ ȸ¼ö¸¦ °¡´ÉÇÑ ÇÑ ÁÙÀδÙ. ¿¹¸¦ µé¾î, 1 °³ÀÇ °³Ã¼·Î 2 °³ÀÇ ÅØ½ºÃ³¸¦ »ç¿ëÇϰí ÀÖ´Â °æ¿ì, ÃÖÃÊÀÇ ÅØ½ºÃ³¸¦ »ç¿ëÇÏ´Â »ï°¢ÇüÀ» ±×·ìÈ­ ÇØ, ÇÊ¿äÇÑ ·»´õ¸µ ½ºÅ×ÀÌÆ®¸¦ ±× »ï°¢Çü¿¡ ºÎ°¡ÇØ ÅØ½ºÃ³¸¦ º¯°æÇÑ´Ù. ´ÙÀ½¿¡, ÀÌÁ¦ 1 °³ÀÇ ÅØ½ºÃ³¸¦ »ç¿ëÇÏ´Â »ï°¢ÇüÀ» ¸ðµÎ ±×·ìÈ­ ÇÑ´Ù. Direct3D ÀÇ °¡Àå ´Ü¼øÇÑ Çϵå¿þ¾î Áö¿øÀº, Çϵå¿þ¾î Ãß»ó °èÃþ (HAL)À» °³ÀÔ½ÃÄÑ, ·»´õ¸µ ½ºÅ×ÀÌÆ®ÀÇ ¹èÄ¡ ¹× ±âº»µµÇüÀÇ ¹èÄ¡¿¡ ÀÇÇØ È£ÃâµÈ´Ù. ¸í·ÉÀÇ ¹èġ󸮸¦ È¿À²ÀûÀ¸·Î ½Ç½ÃÇϸé, ½ÇÇà½ÃÀÇ HAL ÀÇ È£Ãâ ȸ¼ö°¡ °¨¼ÒÇÑ´Ù.

Á¶¸í¿¡ °üÇÑ ÈùÆ®

¶óÀÌÆ®¸¦ Àû¿ëÇßÀ» °æ¿ì, ·»´õ¸µ µÇ´Â °¢ ÇÁ·¹ÀÓ¿¡ Á¤Á¡ ´ÜÀ§ÀÇ ºÎÇϰ¡ ´õÇØÁø´Ù. µû¶ó¼­, ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¶óÀÌÆ®¸¦ ½ÅÁßÇÏ°Ô »ç¿ëÇϸé, ÆÛÆ÷¸Õ½ºÀÇ ´ëÆøÀûÀÎ Çâ»óÀ» Àü¸ÁÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ ÈùÆ®ÀÇ ´ëºÎºÐÀº,"ÃÖ°í ¼ÓµµÀÇ ÄÚµå´Â ºÒ·Á °¡Áö ¾Ê´Â ÄÚµåÀÌ´Ù" ¶ó°í ÇÏ´Â »ý°¢¿¡ ±Ù°ÅÇÑ´Ù.

ÅØ½ºÃ³ »çÀÌÁî

ÅØ½ºÃ³ ¸ÊÇÎÀÇ ÆÛÆ÷¸Õ½º´Â, ¸Þ¸ð¸®ÀÇ ¼Óµµ¿¡ Å©°Ô ÀÇÁ¸ÇÑ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÅØ½ºÃ³¸¦ ij½¬ÇÒ ¶§ÀÇ ÆÛÆ÷¸Õ½º¸¦ ÃÖ´ëÇÑÀ¸·Î ³ôÀÏ ¹æ¹ýÀÌ ¸î°³Àΰ¡ ÀÖ´Ù.

µ¿Àû ÅØ½ºÃ³ÀÇ »ç¿ë¹ý

µå¶óÀ̹ö°¡ µ¿Àû ÅØ½ºÃ³¸¦ Áö¿ø Çϰí ÀÖÀ»Áö ¾î¶³Áö¸¦ È®ÀÎÇÏ·Á¸é ,D3DCAPS9 ±¸Á¶Ã¼ÀÇ D3DCAPS2_DYNAMICTEXTURES Ç÷¡±×¸¦ Á¶»çÇÑ´Ù.

µ¿Àû ÅØ½ºÃ³¸¦ »ç¿ëÇÏ´Â °æ¿ì´Â, Ç×»ó ´ÙÀ½ÀÇ Á¡¿¡ ÁÖÀÇ ÇØ¾ß ÇÑ´Ù.

µ¿Àû ÅØ½ºÃ³´Â Æ÷¸Ë ¸¶´Ù 1 °³¸¸, ¶Ç °¡´ÉÇÏ¸é »çÀÌÁî ¸¶´Ù 1 °³ÀÎ ¸¸Å­ »ý¼º ÇÏ´Â °ÍÀÌ ÁÁ°Ú´Ù. ¸ðµç ·¹º§À» Àá±×´Â °Í¿¡ ÀÇÇØ ¿À¹öÇìµå°¡ Áõ´ëÇϹǷÎ, µ¿ÀûÀÎ ¹Ó¸Ê, Å¥ºê, ¹× º¼·ýÀº Ãßõ ÇÒ ¼ö ¾ø´Ù. ¹Ó¸ÊÀÇ °æ¿ì, ÃÖ»óÁ¤µµ ·¹º§¿¡¼­¸¸ LOCK_DISCARD ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÃÖ»óÁ¤µµ ·¹º§À» Àá±Ý¸¸À¸·Î ¸ðµç ·¹º§ÀÌ ÆÄ±âµÈ´Ù. ÀÌ µ¿ÀÛÀº, º¼·ý ¹× Å¥ºê¿¡¼­µµ °°ÀÌÀÌ´Ù. Å¥ºêÀÇ °æ¿ì, ÃÖ»óÁ¤µµ ·¹º§ ¹× ¸é 0 ÀÌ Àá±Ý µÈ´Ù.

´ÙÀ½ÀÇ ÀÇ»ç ÄÚµå´Â, µ¿Àû ÅØ½ºÃ³ÀÇ »ç¿ë¿¹¸¦ ³ªÅ¸³»°í ÀÖ´Ù.

DrawProceduralTexture(pTex)
{
    // pTex should not be very small because overhead of 
    //   calling driver every D3DLOCK_DISCARD will not 
    //   justify the performance gain.  Experimentation is encouraged.
    pTex->Lock(D3DLOCK_DISCARD);
    <Overwrite *entire* texture>
    pTex->Unlock();
    pDev->SetTexture();
    pDev->DrawPrimitive();
}

µ¿ÀûÀÎ Á¤Á¡ ¹öÆÛ¿Í À妽º ¹öÆÛÀÇ »ç¿ë¹ý

±×·¡ÇȽº ÇÁ·Î¼¼¼­¿¡ ÀÇÇÑ »ç¿ëÁß¿¡ Á¤ÀûÀÎ Á¤Á¡ ¹öÆÛ¸¦ Àá±×¸é ÆÛÆ÷¸Õ½º°¡ Å«ÆøÀ¸·Î ÀúÇÏÇÒ °¡´É¼ºÀÌ ÀÖ´Ù. Àá±Ý È£ÃâÀº, È£Ãâ¿øÀÇ ¾ÖÇø®ÄÉÀ̼ǿ¡ µ¹¾Æ¿À±â Àü¿¡, ±×·¡ÇȽº ÇÁ·Î¼¼¼­°¡ ¹öÆÛ·ÎºÎÅÍ Á¤Á¡ µ¥ÀÌÅÍ ¶Ç´Â À妽º µ¥ÀÌÅÍÀÇ Àб⸦ ¿Ï·áÇÒ ¶§±îÁö ´ë±âÇÒ Çʿ䰡 ÀÖ¾î, ´ëÆøÀûÀÎ Áö¿¬ÀÌ »ý±ä´Ù. ±×·¡ÇȽº ÇÁ·Î¼¼¼­´Â Àá±Ý Æ÷ÀÎÅÍ¿¡ µ¹¾Æ¿À±â Àü¿¡ Ä¿¸àµå¸¦ ¿Ï·áÇÒ Çʿ䰡 ÀÖ±â (À§ÇØ)¶§¹®¿¡, ½ºÅÂÆ½ ¹öÆÛ¿¡ ´ëÇØ¼­ Àá±Ý°ú ·»´õ¸µÀ» 1 ÇÁ·¹ÀÓ ±Ùó ¿©·¯ Â÷·Ê ½ÇÇàÇÏ´Â °æ¿ìµµ, ±×·¡ÇȽº ÇÁ·Î¼¼¼­´Â ·»´õ¸µ Ä¿¸àµå¸¦ ¹öÆÛ¿¡ ³ÖÀ» ¼ö°¡ ¾ø´Ù. ¹öÆÛ¿¡ ÀúÀå µÈ Ä¿¸àµå°¡ ¾øÀ¸¸é ¾ÖÇø®ÄÉÀ̼ÇÀÌ Á¤Á¡ ¹öÆÛ ¶Ç´Â À妽º ¹öÆÛ¿¡ÀÇ ÀúÀåÀ» ¿Ï·áÇØ ·»´õ¸µ Ä¿¸àµå¸¦ ¹ßÇàÇÒ ¶§±îÁö, ±×·¡ÇȽº ÇÁ·Î¼¼¼­´Â ¾ÆÀ̵¹ÀÌ µÈ´Ù.

ÀÌ»óÀº Á¤Á¡ µ¥ÀÌÅÍ ¶Ç´Â À妽º µ¥ÀÌÅͰ¡ ÀüÇô º¯È­ÇÏÁö ¾Ê´Â °ÍÀÌÁö¸¸, À̰ÍÀº ¹Ýµå½Ã °¡´ÉÇÏÁö ¾Ê´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÇÁ·¹ÀÓ ¸¶´Ù Á¤Á¡ µ¥ÀÌÅÍ ¶Ç´Â À妽º µ¥ÀÌÅ͸¦ º¯°æÇÏ´Â °æ¿ì´Â ¸¹ÀÌ ÀÖ¾î, ÇÁ·¹ÀÓ ±Ùó ¿©·¯ Â÷·Ê º¯°æÇÏ´Â °Í Á¶Â÷ ÀÖ´Ù. ÀÌ·¯ÇÑ °æ¿ì´Â, D3DUSAGE_DYNAMIC ¸¦ »ç¿ëÇØ Á¤Á¡ ¹öÆÛ ¶Ç´Â À妽º ¹öÆÛ¸¦ »ý¼º ÇÒ Çʿ䰡 ÀÖ´Ù. ÀÌ ÀÌ¿ë Ç÷¡±×¿¡ ÀÇÇØ Direct3D ¸¦ ºó¹øÇÑ Àá±Ý 󸮿ëÀ¸·Î ÃÖÀûÈ­ÇÑ´Ù. D3DUSAGE_DYNAMIC ´Â ¹öÆÛ¸¦ ºó¹øÇÏ°Ô Àá±×´Â °æ¿ì¿¡¸¸ À¯¿ëÇϰí, º¯È­ÇÏÁö ¾Ê´Â µ¥ÀÌÅÍ´Â Á¤ÀûÀÎ Á¤Á¡ ¹öÆÛ ¶Ç´Â À妽º ¹öÆÛ¿¡ ÀúÀå ÇÒ Çʿ䰡 ÀÖ´Ù.

¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î µ¿ÀûÀÎ Á¤Á¡ ¹öÆÛ »ç¿ë½ÃÀÇ ÆÛÆ÷¸Õ½º¸¦ Çâ»ó½ÃŰ·Á¸é , ÀûÀýÇÑ Ç÷¡±×¸¦ ÁöÁ¤ÇØ IDirect3DVertexBuffer9::Lock ¶Ç´Â IDirect3DIndexBuffer9::Lock ¸¦ È£ÃâÇÒ Çʿ䰡 ÀÖ´Ù. D3DLOCK_DISCARD ´Â, ¾ÖÇø®ÄÉÀ̼ÇÀÌ ³°Àº Á¤Á¡ µ¥ÀÌÅÍ ¶Ç´Â À妽º µ¥ÀÌÅ͸¦ ¹öÆÛ³» ·Î À¯ÁöÇÒ Çʿ䰡 ¾ø´Â °ÍÀ» ³ªÅ¸³½´Ù. D3DLOCK_DISCARD ·Î Àá±ÝÀ» È£ÃâÇÑ ½ÃÁ¡¿¡¼­ ±×·¡ÇȽº ÇÁ·Î¼¼¼­°¡ ¾ÆÁ÷ ¹öÆÛ¸¦ »ç¿ëÁßÀÎ °æ¿ì´Â, ³°Àº ¹öÆÛ µ¥ÀÌÅÍ ´ë½Å¿¡ ¸Þ¸ð¸®ÀÇ »õ·Î¿î ¿µ¿ªÀÇ Æ÷ÀÎÅͰ¡ ¹ÝȯµÈ´Ù. À̰Ϳ¡ ÀÇÇØ, ¾ÖÇø®ÄÉÀ̼ÇÀÌ »õ·Î¿î ¹öÆÛ¿¡ µ¥ÀÌÅ͸¦ ÀúÀå ÇÒ ¶§±îÁö, ±×·¡ÇȽº ÇÁ·Î¼¼¼­´Â ³°Àº µ¥ÀÌÅ͸¦ °è¼Ó »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù. ¾ÖÇø®ÄÉÀ̼ǿ¡ ÀÇÇÑ Ãß°¡ÀÇ ¸Þ¸ð¸® ¸Þ´ÏÁö¸ÕÆ®´Â ÇÊ¿ä¾ø´Ù. ±×·¡ÇȽº ÇÁ·Î¼¼¼­°¡ ³°Àº ¹öÆÛ¸¦ ´Ù »ç¿ëÇϸé , ³°Àº ¹öÆÛ´Â ÀÚµ¿ÀûÀ¸·Î ÀçÀÌ¿ë ¶Ç´Â ÆÄ±âµÈ´Ù. D3DLOCK_DISCARD ¸¦ »ç¿ëÇØ ¹öÆÛ¸¦ Àá±×¸é Ç×»ó ¹öÆÛ Àüü°¡ ÆÄ±âµÇ´Â °Í, ºñÁ¦·ÎÀÇ ¿ÀÇÁ¼Â(offset) ¶Ç´Â Á¦ÇѺÎÀÇ »çÀÌÁî Çʵ带 ÁöÁ¤ Çϸé, Àá±×Áö ¾ÊÀº ¹öÆÛ ¿µ¿ªÀÇ Á¤º¸´Â º¸°ü À¯ÁöµÇÁö ¾Ê´Â °Í¿¡ ÁÖÀÇ ÇØ¾ß ÇÑ´Ù.

½ºÇÁ¶óÀÌÆ®¸¦ ·»´õ¸µ Çϱâ À§Çؼ­ 4 °³ÀÇ Á¤Á¡À» Ãß°¡ÇÏ´Â °æ¿ì¿Í °°ÀÌ, ¾ÖÇø®ÄÉÀ̼ÇÀÌ 1 ȸÀÇ Àá±ÝÀ¸·Î ÀúÀå ÇÏ´Â µ¥ÀÌÅÍÀÇ ¾çÀÌ ÀûÀº °æ¿ì°¡ ÀÖ´Ù. D3DLOCK_NOOVERWRITE ´Â, ÀÌ¹Ì »ç¿ëÁßÀÎ µ¿Àû ¹öÆÛ³»ÀÇ µ¥ÀÌÅ͸¦ ¾ÖÇø®ÄÉÀ̼ÇÀÌ µ¡¾²±âÇÏÁö ¾Ê´Â °ÍÀ» ³ªÅ¸³½´Ù. Àá±Ý È£ÃâÀº ³°Àº µ¥ÀÌÅÍÀÇ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù. À̰Ϳ¡ ÀÇÇØ, ¾ÖÇø®ÄÉÀ̼ÇÀº Á¤Á¡ ¹öÆÛ ¶Ç´Â À妽º ¹öÆÛ³»ÀÇ ¹Ì»ç¿ë ¿µ¿ª¿¡ »õ·Î¿î µ¥ÀÌÅ͸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù. µå·ÎÀ×(Drawing) 󸮷Π»ç¿ëÇÑ Á¤Á¡ ¶Ç´Â À妽º´Â, ±×·¡ÇȽº ÇÁ·Î¼¼¼­¿¡ ÀÇÇØ ¾ÆÁ÷ »ç¿ëÁßÀÏ °¡´É¼ºÀÌ ÀÖ±â (À§ÇØ)¶§¹®¿¡, ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î º¯°æÇؼ­´Â ¾È µÈ´Ù. µ¿Àû ¹öÆÛ°¡ °¡µæ µÇ¾î ¸Þ¸ð¸®ÀÇ »õ·Î¿î ¿µ¿ªÀ» ³³µæÇÒ ¼ö ¾ø°Ô µÇ¸é ¾ÖÇø®ÄÉÀ̼ÇÀº D3DLOCK_DISCARD ¸¦ »ç¿ëÇØ, ±×·¡ÇȽº ÇÁ·Î¼¼¼­°¡ ´Ù »ç¿ëÇÑ ÈÄÀÇ ³°Àº Á¤Á¡ µ¥ÀÌÅÍ ¶Ç´Â À妽º µ¥ÀÌÅ͸¦ ÆÄ±âÇÑ´Ù.

±×·¡ÇȽº ÇÁ·Î¼¼¼­°¡ Á¤Á¡À» ¾ÆÁ÷ »ç¿ëÁßÀÎÁö ¾Æ´ÑÁöÀÇ È®Àο¡´Â, ºñµ¿±â ¹®ÀÇ ¸ÞÄ«´ÏÁòÀÌ µµ¿òÀÌ µÈ´Ù. Á¤Á¡À» »ç¿ëÇÏ´Â ¸¶Áö¸· DrawPrimitive È£ÃâÀÇ µÚ, D3DQUERYTYPE_EVENT ŸÀÔÀÇ ¹®ÀǸ¦ ¹ßÇàÇÑ´Ù. IDirect3DQuery9::GetData °¡ S_OK ¸¦ µ¹·ÁÁÖ¾úÀ» °æ¿ì, Á¤Á¡Àº ÀÌ¹Ì »ç¿ëÁßÀº ¾Æ´Ï´Ù. ¹öÆÛ¸¦ Àá±Û ¶§ D3DLOCK_DISCARD ¸¦ ÁöÁ¤ÇßÀ» °æ¿ì, ¶Ç´Â Ç÷¡±×¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Ò´ø °æ¿ì´Â, Ç×»ó Á¤Á¡ÀÌ ±×·¡ÇȽº ÇÁ·Î¼¼¼­¿Í ÀûÀýÈ÷ µ¿±â ÇÏÁö¸¸, Ç÷¡±×¸¦ ÁöÁ¤ÇÏÁö ¾Ê°í Àá±ÝÀ» ½ÇÇà Çϸé, À§ÀÇ¿Í ¿ì¸® ÆÛÆ÷¸Õ½ºÀÇ ÀúÇϸ¦ °¡Á®¿Ã °¡´É¼ºÀÌ ÀÖ´Ù. BeginScene ,EndScene ,Present µîÀÇ ±× ¿ÜÀÇ API È£Ãâ¿¡¼­´Â, ±×·¡ÇȽº ÇÁ·Î¼¼¼­°¡ Á¤Á¡À» ´Ù »ç¿ëÇß´ø °ÍÀº º¸ÁõµÇÁö ¾Ê´Â´Ù.

µ¿Àû ¹öÆÛ¿Í ÀûÀýÇÑ Àá±Ý Ç÷¡±×ÀÇ »ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.

	    // USAGE STYLE 1
    // Discard the entire vertex buffer and refill with thousands of vertices.
    // Might contain multiple objects and/or require multiple DrawPrimitive 
    //   calls separated by state changes, etc.
 
    // Determine the size of data to be moved into the vertex buffer.
    UINT nSizeOfData = nNumberOfVertices * m_nVertexStride;
 
    // Discard and refill the used portion of the vertex buffer.
    CONST DWORD dwLockFlags = D3DLOCK_DISCARD;
    
    // Lock the vertex buffer.
    BYTE* pBytes;
    if( FAILED( m_pVertexBuffer->Lock( 0, 0, &pBytes, dwLockFlags ) ) )
        return false;
    
    // Copy the vertices into the vertex buffer.
    memcpy( pBytes, pVertices, nSizeOfData );
    m_pVertexBuffer->Unlock();
 
    // Render the primitives.
    m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, nNumberOfVertices/3)
	    // USAGE STYLE 2
    // Reusing one vertex buffer for multiple objects
 
    // Determine the size of data to be moved into the vertex buffer.
    UINT nSizeOfData = nNumberOfVertices * m_nVertexStride;
 
    // No overwrite will be used if the vertices can fit into 
    //   the space remaining in the vertex buffer.
    DWORD dwLockFlags = D3DLOCK_NOOVERWRITE;
    
    // Check to see if the entire vertex buffer has been used up yet.
    if( m_nNextVertexData > m_nSizeOfVB - nSizeOfData )
    {
        // No space remains.  Start over from the beginning 
        //   of the vertex buffer.
        dwLockFlags = D3DLOCK_DISCARD;
        m_nNextVertexData = 0;
    }
    
    // Lock the vertex buffer.
    BYTE* pBytes;
    if( FAILED( m_pVertexBuffer->Lock( (UINT) m_nNextVertexData, nSizeOfData, 
               &pBytes, dwLockFlags ) ) )
        return false;
    
    // Copy the vertices into the vertex buffer.
    memcpy( pBytes, pVertices, nSizeOfData );
    m_pVertexBuffer->Unlock();
 
    // Render the primitives.
    m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 
               m_nNextVertexData/m_nVertexStride, nNumberOfVertices/3)
 
    // Advance to the next position in the vertex buffer.
    m_nNextVertexData += nSizeOfData;

¸Þ½¬ÀÇ »ç¿ë¹ý

¸Þ½¬¸¦ ÃÖÀûÈ­ÇÏ·Á¸é , Direct3D ÀÇ À妽º ÷ºÎ »ï°¢Çü ½ºÆ®¸³Àº ¾Æ´Ï°í, À妽º ÷ºÎ »ï°¢ÇüÀ» »ç¿ëÇÑ´Ù. Çϵå¿þ¾î´Â, ¿¬¼ÓÇÏ´Â »ï°¢ÇüÀÇ 95% °¡ ½ÇÁ¦·Î ½ºÆ®¸³À» Çü¼ºÇϰí ÀÖ´Â °ÍÀ¸·Î¼­ °ËÃâÇØ, °Å±â¿¡ ÀÀÇØ Á¶Á¤À» ½Ç½ÃÇÑ´Ù. ¸¹Àº µå¶óÀ̹ö´Â, À¯»ê Çϵå¿þ¾î¿¡ ´ëÇØ¼­µµ ÀÌ·¯ÇÑ Ã³¸®¸¦ ½Ç½ÃÇÑ´Ù.

Direct3D extension (D3DX) ¸Þ½¬ °³Ã¼´Â, °¢ »ï°¢Çü, Áï ¸é¿¡ DWORD ·Î ÅÂ±× ºÙÀ̰í ÇÒ ¼ö°¡ ÀÖ´Ù. ÀÌ Å±״Â, ±× ¸éÀǼӼºÀ̶ó°í ºÎ¸¥´Ù. DWORD ÀÇ Àǹ̵éÀº »ç¿ëÀÚ°¡ Á¤ÀÇÇÑ´Ù. D3DX ´Â À̰͵éÀ» »ç¿ëÇØ ¸Þ½¬¸¦ ¼­ºê ¼¼Æ®·Î ºÐ·ùÇÑ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀº,ID3DXMesh::LockAttributeBuffer ÀÇ È£ÃâÀ» »ç¿ëÇØ °¢¸éÀÇ ¼Ó¼ºÀ» ¼³Á¤ÇÑ´Ù. ID3DXMesh::Optimize ¸Þ¼­µå¿¡¼­´Â, D3DXMESHOPT_ATTRSORT ¿É¼ÇÀ» »ç¿ëÇØ, ¸Þ½¬ÀÇ Á¤Á¡ ¹× ¸éÀ» ¼Ó¼º¿¡ ÀÇÇØ ±×·ìÈ­ ÇÒ ¼ö ÀÖ´Ù. À̰ÍÀ» ½Ç½ÃÇϸé, ¸Þ½¬ °³Ã¼¿¡ ÀÇÇØ ¼Ó¼º Å×À̺íÀÌ °è»êµÈ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀº ID3DXBaseMesh::GetAttributeTable ¸¦ È£ÃâÇØ, ÀÌ Å×À̺íÀ» ÃëµæÇÒ ¼ö ÀÖ´Ù. ¸Þ½¬°¡ ¼Ó¼º¿¡ ÀÇÇØ ºÐ·ùµÇÁö ¾ÊÀº °æ¿ì, ÀÌ È£ÃâÀº 0 À» µ¹·ÁÁØ´Ù. ¼Ó¼º Å×À̺íÀº ID3DXMesh::Optimize ¸Þ¼­µå°¡ »ý¼ºÇϹǷÎ, ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÀÌ Å×À̺íÀ» ¼³Á¤ÇÒ ¼ö ¾ø´Ù. ¼Ó¼º¿¡ ÀÇÇÑ ºÐ·ù´Â µ¥ÀÌÅÍÀÇ ¿µÇâÀ» ¹Þ´Â´Ù. µû¶ó¼­, ¾ÖÇø®ÄÉÀ̼ÇÀº, ¸Þ½¬°¡ ¼Ó¼º¿¡ ±Ù°ÅÇØ ºÐ·ùµÇ°í ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Â °æ¿ì¿¡¼­µµ,ID3DXMesh::Optimize ¸¦ È£ÃâÇØ ¼Ó¼º Å×À̺íÀ» »ý¼ºÇÒ Çʿ䰡 ÀÖ´Ù.

ÀÌÇÏ¿¡, ¸Þ½¬ÀÇ ´Ù¾çÇÑ ¼Ó¼º¿¡ ´ëÇØ °¡¸®Å²´Ù.

¼Ó¼º ID

¼Ó¼º ½Äº°ÀÚ (ID)´Â, ¸éÀÇ ±×·ìÀ» ¼Ó¼º ±×·ì¿¡ °ü·ÃÁþ´Â °ªÀÌ´Ù. ÀÌ ID ´Â,ID3DXBaseMesh::DrawSubset ·Î µå·ÎÀ×(Drawing) ÇÏ´Â ¸éÀÇ ¼­ºê ¼¼Æ®¸¦ ±â¼úÇÑ´Ù. ¼Ó¼º ID ´Â, ¼Ó¼º ¹öÆÛ³»ÀÇ ¸é¿¡ ´ëÇØ¼­ ÁöÁ¤ÇÑ´Ù. ¼Ó¼º ID ÀÇ ½ÇÁ¦ÀÇ °ªÀº, 32 ºñÆ®¿¡ µé¾î°¡¸é ¾î¶°ÇÑ °ª¿¡¼­µµ »ó°ü¾øÁö¸¸, ÀϹÝÀûÀ¸·Î´Â 0 ~ n (n ´Â ¼Ó¼ºÀÇ ¼ö)¸¦ »ç¿ëÇÑ´Ù.

¼Ó¼º ¹öÆÛ

¼Ó¼º ¹öÆÛ´Â, °¢¸éÀÌ ¼ÓÇÏ´Â ¼Ó¼º ±×·ìÀ» ÁöÁ¤ÇÏ´Â DWORD (°¢¸é¿¡ 1 °³)ÀÇ ¹è¿­ÀÌ´Ù. ÀÌ ¹öÆÛ´Â, ¸Þ½¬ÀÇ »ý¼º½Ã¿¡ Á¦·Î¿¡ ÃʱâÈ­µÇÁö¸¸, ·Îµå ·çƾ¿¡ ÀÇÇØ °ªÀ» ÁöÁ¤ÇÏ´ÂÁö, ID 0 ÀÇ ¼Ó¼ºÀÌ º¹¼ö°³ ÇÊ¿äÇÑ °æ¿ì¿¡´Â »ç¿ëÀÚ¿¡ ÀÇÇØ ÁöÁ¤ÇÒ±îÀÇ ¸î°³ÀÇ Çʿ䰡 ÀÖ´Ù. ÀÌ ¹öÆÛ¿¡´Â,ID3DXMesh::Optimize ·Î ¼Ó¼º¿¡ ±Ù°ÅÇØ ¸Þ½¬¸¦ ¼ÒÆ® Çϱâ À§Çؼ­ »ç¿ëÇÏ´Â Á¤º¸°¡ ÀúÀå µÈ´Ù. ¼Ó¼º Å×À̺íÀÌ Á¦½ÃµÇÁö ¾ÊÀº °æ¿ì,ID3DXBaseMesh::DrawSubset ´Â ÀÌ ¹öÆÛ¸¦ Á¶»çÇØ, µå·ÎÀ×(Drawing) ÇÏ´Â ÁöÁ¤ÀÇ ¼Ó¼ºÀÇ ¸éÀ» ¼±ÅÃÇÑ´Ù.

¼Ó¼º Å×À̺í

¼Ó¼º Å×À̺íÀº, ¸Þ½¬¿¡ ÀÇÇØ ¼ÒÀ¯¡¤º¸°ü À¯ÁöµÇ´Â ±¸Á¶Ã¼ÀÌ´Ù. À̰ÍÀ» »ý¼ºÇÏ·Á¸é , ¼Ó¼º ¼ÒÆ® ±â´É ¶Ç´Â ÃÖÀûÈ­ÀÇ °­È­ ±â´ÉÀ» À¯È¿ÇÏ°Ô ÇØ ID3DXMesh::Optimize ¸¦ È£ÃâÇÒ Çʿ䰡 ÀÖ´Ù. ¼Ó¼º Å×À̺íÀ» »ç¿ëÇÏ¸é ±âº»µµÇü¸¦ µå·ÎÀ×(Drawing) ÇÏ´Â ID3DXBaseMesh::DrawSubset ÀÇ ´ÜÀÏÀÇ È£ÃâÀ» Àçºü¸£°Ô ½Ç½ÃÇÒ ¼ö°¡ ÀÖ´Ù. ¶Ç, ÇÁ·Î±×·¡½Ãºê ¸Þ½¬µµ ÀÌ ±¸Á¶Ã¼¸¦ º¸°ü À¯ÁöÇϹǷÎ, ÇöÀçÀÇ »ó¼¼ ·¹º§·Î ¾×ƼºêÇÑ ¸é°ú Á¤Á¡À» Ç¥½ÃÇÒ ¼ö ÀÖ´Ù.

z ¹öÆÛÀÇ ÆÛÆ÷¸Õ½º

½ÅÀÌ ÀüºÎÅÍ ÈÄ¿¡ ·»´õ¸µ µÇµµ·Ï(µíÀÌ), z ¹öÆÛ¸µÀ» »ç¿ëÇØ ÅØ½ºÃ³ 󸮸¦ ½Ç½ÃÇϸé, ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÆÛÆ÷¸Õ½º¸¦ Çâ»ó½Ãų ¼ö°¡ ÀÖ´Ù. ÅØ½ºÃ³¸¦ Àû¿ëÇØ, z ¹öÆÛ¸¦ »ç¿ëÇÑ ±âº»µµÇü´Â, Áֻ缱 ´ÜÀ§·Î z ¹öÆÛ¿¡ ´ëÇØ »çÀü¿¡ Å×½ºÆ®µÈ´Ù. Àü¿¡ ·»´õ¸µ µÈ ´Ù°¢Çü¿¡ ÀÇÇØ Áֻ缱ÀÌ ¼û¾î ÀÖ´Â °æ¿ì´Â, ±× ´Ù°¢ÇüÀÌ ½Ã½ºÅÛ¿¡ ÀÇÇØ Àçºü¸£°Ô È¿À²ÀûÀ¸·Î Á¦°ÅµÈ´Ù. z ¹öÆÛ¸µ¿¡ ÀÇÇØ ÆÛÆ÷¸Õ½º´Â Çâ»óÇÏÁö¸¸, ÀÌ ¹æ¹ýÀº Àå¸é(scene)·Î °°Àº Çȼ¿À» ¿©·¯ Â÷·Ê µå·ÎÀ×(Drawing) ÇÒ °æ¿ì¿¡ °¡Àå À¯È¿ÇÏ´Ù. À̰ÍÀ» Á¤È®ÇÏ°Ô °è»êÇÏ´Â °ÍÀº ¾î·ÆÁö¸¸, ±Ù»çÄ¡¸¦ ¿ä±¸ÇÒ ¼ö ÀÖ´Ù. °°Àº Çȼ¿À» 1 ȸ ¹Û¿¡ µå·ÎÀ×(Drawing) ÇÏÁö ¾Ê´Â °æ¿ì´Â, z ¹öÆÛ¸µÀ» ¿ÀÇÁ·Î ÇØ, Àå¸é(scene)¸¦ ³ªÁß¿¡ Àü¿¡ ·»´õ¸µ Çϸé, ÃÖ°íÀÇ ÆÛÆ÷¸Õ½º¸¦ ¾òÀ» ¼ö ÀÖ´Ù.



© 2002 Microsoft Corporation. All rights reserved.
¡èTOP