DirectX Graphics ÇÁ·Î±×·¡¹Ö °¡ÀÌµå °íµµÀÇ ÁÖÁ¦ Á¤Á¡ ÆÄÀÌÇÁ¶óÀΠƼ¼¿·¹ÀÌ¼Ç [¸ñÂ÷¿¶÷] [ÁÖ¼Òº¹»ç] [½½·Ôºñ¿ì±â]
|
| Microsoft DirectX 9.0 |
Å×¼³·¹ÀÌ¼Ç À¯´ÏÆ®°¡ °ÈµÇ¾ú´Ù. ´ÙÀ½ ÀÏÀÌ »ý±â°Ô µÇ¾ú´Ù.
Microsoft® DirectX® 8. x ·Î ORDER ·Î ºÒ¸®°í ÀÖ´ø °ÍÀº, ½ÇÁ¦´Â Â÷¼ö¿´´Ù. DirectX 9.0 ¿¡¼´Â,D3DDEGREETYPE ¸¦ »ç¿ëÇØ Â÷¼ö¸¦ ÁöÁ¤ÇÑ´Ù.
// This used to be D3DORDERTYPE and D3DORDER*
typedef enum _D3DDEGREETYPE
{
D3DDEGREE_LINEAR = 1,
D3DDEGREE_QUADRATIC = 2,
D3DDEGREE_CUBIC = 3,
D3DDEGREE_QUINTIC = 5,
D3DDEGREE_FORCE_DWORD = 0x7fffffff,
} D3DDEGREETYPE;
Â÷¼öÀÇ ÇüÅÂÀÇ º¯°æÀº, ´Ù¸¥ 2 °³ÀÇ ±¸Á¶Ã¼¿¡ ¿µÇâÀ» ÁÖ¾ú´Ù.
typedef struct _D3DRECTPATCH_INFO
{
UINT StartVertexOffsetWidth;
UINT StartVertexOffsetHeight;
UINT Width;
UINT Height;
UINT Stride;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DRECTPATCH_INFO;
typedef struct _D3DTRIPATCH_INFO
{
UINT StartVertexOffset;
UINT NumVertices;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DTRIPATCH_INFO;
µå¶óÀ̹ö¿¡¼´Â, »õ·Î¿î Çì´õ¸¦ »ç¿ëÇØ ÄÄÆÄÀÏ ÇßÀ» ¶§¿¡ ÀÌ º¯°æÀÌ ¿øÀÎÀ¸·Î ¹ß»ýÇÏ´Â compile error¸¦ ¼öÁ¤ÇÒ Çʿ䰡 ÀÖ´Ù. ±â´ÉÀ» º¯°æÇÒ ÇÊ¿ä´Â ¾ø´Ù.
ÀûÀÀÇü Å×¼³·¹À̼ÇÀº, N ÆÐÄ¡, Á÷»ç°¢Çü ÆÐÄ¡, »ï°¢Çü ÆÐÄ¡µîÀÇ °íÂ÷¿ø ¿ø½ÃÀûÀ¸·Î Àû¿ëÇÒ ¼ö ÀÖ´Ù. D3DRS_ENABLEADAPTIVETESSELLATION ¸¦ »ç¿ëÇØ ÀÌ ±â´ÉÀ» À¯È¿ÇÏ°Ô Çϸé, ½ÃÁ¡ °ø°£³»ÀÇ Á¦¾î Á¤Á¡ÀÇ ±íÀÌÀÇ °ª¿¡ ±Ù°ÅÇØ, ÆÐÄ¡°¡ ÀûÀÀÀûÀ¸·Î Å×¼³·¹ÀÌ¼Ç µÈ´Ù.
Á¦¾î Á¤Á¡ (Vi)ÀÇ Z ÁÂÇ¥ (Zi)´Â, 4 °³ÀÇ º¤ÅÍÀÇ ³»ÀûÀ» °è»êÇÏ´Â °Í¿¡ ÀÇÇØ ½ÃÁ¡ °ø°£ (Zieye)¿¡ º¯È¯ µÈ´Ù. ÀÌ Á¦¾î Á¤Á¡ÀÇ Z ÁÂÇ¥¸¦ ±íÀÌÀÇ °ªÀ¸·Î »ç¿ëÇÑ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀº, 4 °³ÀÇ ·»´õ¸µ ½ºÅ×ÀÌÆ® (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z, D3DRS_ADAPTIVETESS_W)¸¦ »ç¿ëÇØ 4D º¤ÅÍ (Mdm)¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ 4D º¤ÅÍ¿¡´Â, ¿¬°áµÈ ¿ùµå Çà·Ä ¹× ºä Çà·ÄÀÇ Á¦ 3 ¿µîÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ º¤Å͸¦ »ç¿ëÇØ Zieye ¿¡ ½ºÄÉÀÏÀ» Àû¿ëÇÒ ¼öµµ ÀÖ´Ù.
Zieye ·ÎºÎÅÍ Å×¼³·¹ÀÌ¼Ç ·¹º§ Ti ¸¦ °è»êÇÏ´Â ÇÔ¼ö´Â (MaxTessellationLevel / Zieye)À̶ó°í °¡Á¤ÇÑ´Ù. À̰ÍÀº, ½ÃÁ¡ °ø°£ÀÇ Z = 1 ¿¡¼´Â MaxTessellationLevel ¿Í Å×¼³·¹ÀÌ¼Ç ·¹º§ÀÌ µ¿ÀÏÇÑ ÀÏÀ» ÀǹÌÇÑ´Ù. N ÆÐÄ¡ÀÇ °æ¿ì, MaxTessellationLevel ´Â,IDirect3DDevice9::SetNPatchMode ¿¡ ÀÇÇØ ¼³Á¤µÈ °ª¿¡ µ¿ÀÏÇÏ´Ù. RT ÆÐÄ¡ÀÇ °æ¿ì´Â, pNumSegs ¿¡ µ¿ÀÏÇÏ´Ù. ÀÌ Å×¼³·¹ÀÌ¼Ç ·¹º§Àº, ÃÖ´ë ¹× ÃÖ¼ÒÀÇ Å×¼³·¹ÀÌ¼Ç ·¹º§À» Á¤ÀÇÇÏ´Â D3DRS_MINTESSELLATIONLEVEL ¹× D3DRS_MAXTESSELLATIONLEVEL ¿¡ ÀÇÇØ Á¤ÀÇµÈ °ª¿¡ Ŭ·¥ÇÁ µÈ´Ù. ÆÐÄ¡ÀÇ ¿§Áö¿¡ µû¸¥ °¢ Á¤Á¡ÀÇ Ti ÀÇ Æò±ÕÀÌ ±× ¿§ÁöÀÇ Å×¼³·¹ÀÌ¼Ç ·¹º§ÀÌ µÈ´Ù. Á÷»ç°¢Çü ÆÐÄ¡, »ï°¢Çü ÆÐÄ¡, ¹× N ÆÐÄ¡ÀÇ Ti ¸¦ °è»êÇÏ´Â ¾Ë°í¸®ÁòÀº, Å×¼³·¹ÀÌ¼Ç ·¹º§ÀÇ °è»ê¿¡ »ç¿ëÇÏ´Â Á¦¾î Á¤Á¡ÀÌ ´Ù¸£´Ù.
B ½ºÇöóÀÎ ±âº» ŸÀÔÀÇ Á÷»ç°¢Çü ÆÐÄ¡ÀÇ °æ¿ì´Â, °¡Àå ¿ÜÃøÀÇ 4 °³ÀÇ Á¦¾î Á¤Á¡À» »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î, D3DORDER_CUBIC ¿À´õŸÀÓÀÇ °æ¿ì, pNumSegs[0] ¿¡´Â Á¤Á¡ (1,1) ¹× (1, width-2)À» »ç¿ëÇØ, pNumSegs[1] ¿¡´Â Á¤Á¡ (1, width-2) ¹× (height-2, height-2)À» »ç¿ëÇÑ´Ù. ¶Ç, pNumSegs[2] ¿¡´Â Á¤Á¡ (height-2, width-2) ¹× (1, width-2)À» »ç¿ëÇØ, pNumSegs[3] ¿¡´Â Á¤Á¡ (2,1) ¹× (1,1)À» »ç¿ëÇÑ´Ù.
»ï°¢Çü ÆÐÄ¡ÀÇ °æ¿ì´Â, ¸ðÅüÀÌÀÇ ÆÐÄ¡ Á¤Á¡À» »ç¿ëÇÑ´Ù. D3DORDER_CUBIC ¿À´õŸÀÓÀÇ °æ¿ì, pNumSegs[0] ¿¡´Â Á¤Á¡ (0) ¹× (9)À» »ç¿ëÇØ, pNumSegs[1] ¿¡´Â Á¤Á¡ (9) ¹× (6)À» »ç¿ëÇØ, pNumSegs[3] ¿¡´Â Á¤Á¡ (6) ¹× (0)À» »ç¿ëÇÑ´Ù.
N ÆÐÄ¡ÀÇ °æ¿ì´Â »ï°¢Çü Á¤Á¡À» »ç¿ëÇÑ´Ù.
º£Áö¾î(Bezier) ±âº» ŸÀÔÀÇ Á÷»ç°¢Çü ÆÐÄ¡ ¹× »ï°¢Çü ÆÐÄ¡ÀÇ °æ¿ì´Â, ¸ðÅüÀÌÀÇ Á¦¾î Á¤Á¡À» »ç¿ëÇÑ´Ù.
Á¤Á¡¸¶´Ù Å×¼³·¹ÀÌ¼Ç ·¹ÀÌÆ® Á¦¾î. ¾ÖÇø®ÄÉÀ̼ÇÀº, Çʿ信 µû¶ó¼, Á¤Á¡ ¸¶´Ù ´ÜÀÏÀÇ Á¤ÀÇ ºÎµ¿ ¼Ò¼öÁ¡°ªÀ» Á¦°øÇØ, Å×¼³·¹ÀÌ¼Ç ·¹ÀÌÆ®ÀÇ Á¦¾î¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ÁöÁ¤¿¡´Â D3DDECLUSAGE_TESSFACTOR ¸¦ »ç¿ëÇÑ´Ù. ´Ù¸¸, »ç¿ë¹ýÀÇ À妽º´Â 0, ÀԷ ŸÀÔÀº D3DDECLTYPE_FLOAT1 °¡ ¾Æ´Ï¸é ¾ÈµÈ´Ù. ÀÌ °ªÀÌ Á¤Á¡¸¶´Ù Å×¼³·¹ÀÌ¼Ç ·¹º§¿¡ Àû»êµÈ´Ù.
¿§Áö e ÀÇ Å×¼³·¹ÀÌ¼Ç ·¹º§ (Te)Àº 2 °³ÀÇ Á¦¾î Á¤Á¡ (Ve1 ¹× Ve2)¿¡ ÀÇÇØ ³ªÅ¸³»Á® ±× °è»êÀº ´ÙÀ½°ú °°ÀÌ ÇàÇØÁø´Ù.
Vertex Vi: (Xi, Yi, Zi, TFactori (optional)). Ze1eye = Ve1 . Mdm Ze2eye = Ve2 . Mdm Te1 = MaxTessellationLevel * TFactore1 / Ze1eye Te2 = MaxTessellationLevel * TFactore2 / Ze2eye Te = ( Te1 + Te2 ) / 2; if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL
D3DRS_ENABLEADAPTIVETESSELLATION °¡ TRUE ¶§, »ï°¢Çü ±âº»µµÇü (»ï°¢Çü ¸®½ºÆ®, ÆÒ, ½ºÆ®¶óÀÌÇÁ)´Â N ÆÐÄ¡·Î¼ µå·ÎÀ×(Drawing) µÈ´Ù. IDirect3DDevice9::SetNPatchMode ¿¡ ÀÇÇØ 1.0 º¸´Ù ÀÛÀº °ªÀ¸·Î ¼³Á¤µÇ¾î ÀÖ´Ù.
»õ·Î¿î ·»´õ¸µ ½ºÅ×ÀÌÆ®:
D3DRS_ENABLEADAPTIVETESSELLATION // BOOL D3DRS_MAXTESSELLATIONLEVEL // Float D3DRS_MINTESSELLATIONLEVEL // Float D3DRS_ADAPTIVETESS_X // Float D3DRS_ADAPTIVETESS_Y // Float D3DRS_ADAPTIVETESS_Z // Float D3DRS_ADAPTIVETESS_W // Float // D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL // cannot be less than 1
ÀÌ·¯ÇÑ µðÆúÆ®°ª:
D3DRS_MAXTESSELLATIONLEVEL = 1.0f D3DRS_MINTESSELLATIONLEVEL = 1.0f D3DRS_ADAPTIVETESS_X = 0.0f D3DRS_ADAPTIVETESS_Y = 0.0f D3DRS_ADAPTIVETESS_Z = 1.0f D3DRS_ADAPTIVETESS_W = 0.0f D3DRS_ENABLEADAPTIVETESSELLATION = FALSE
»õ·Î¿î Çϵå¿þ¾î ´É·Â:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches