|
|
|
|
|
|
Additional info
|
|
|
|
|
Latest Forum posts
|
|
|
|
|
Ads
|
|
|
|
|
|
|
|
|
|
|
|

Áö±Ý±îÁö ¿ì¸®´Â ÁöÇüÀ» Ç¥ÇöÇϱâ ÃæºÐÇÑ ¿¬½ÀÀ» ÇØ¿Ô½À´Ï´Ù. À̹ø tutorial¿¡¼´Â ÁöÇüÀ» ±×·Áº¼ ÅÙµ¥, ¿ì¼± °£´ÜÇÑ °Í ºÎÅÍ ½ÃÀÛÇØº¾½Ã´Ù. 4*3ÀÇ vertexµéÀÌ ¿¬°áµÇ¾î ÀÖ´Â ÇüÅÂÀÇ ÁöÇüÀ» ±×·Áº¸µµ·Ï ÇϰڽÀ´Ï´Ù. »ç½Ç ÁöÇüÀº º¸Åë ´ë±Ô¸ð·Î Ç¥ÇöµÇ°í ¶§·Î´Â º¯ÈÇϱ⵵ Çϱ⠶§¹®¿¡ ´ë±Ô¸ðÀÇ vertexµéÀ» µ¿ÀûÀ¸·Î ´Ù·ê Çʿ䰡 ÀÖ½À´Ï´Ù. ´ë±Ô¸ðÀÇ vertexµéÀ» ´Ù·ç´Â ¹æ¹ý¿¡ ´ëÇØ¼´Â ´ÙÀ½ tutorial¿¡¼ ´Ù·ç°Ú½À´Ï´Ù.
ÀÌÁ¦ »õ·Î¿î Windows Game ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇϰí ÇÊ¿äÇÑ ÆÄÀϵéÀ» ÀÌÀüÀÇ tutorial¿¡¼ º¹»çÇØ ¿É½Ã´Ù.
4*3ÀÇ vertexµéÀ» ´Ù·ç±â À§Çؼ µÎ °³ÀÇ Àü¿ªº¯¼ö°¡ Ãß°¡µË´Ï´Ù.
int WIDTH = 4; int HEIGHT = 3;
½±°Ô »ý°¢Çؼ WIDTH´Â xÃà¿¡ ´ëÇÑ vertex°³¼ö, HEIGHT´Â yÃà¿¡ ´ëÇÑ vertex°³¼ö¶ó°í »ý°¢ÇÏ¸é µË´Ï´Ù. ÃÑ vertex°³¼ö´Â 4*3=12°¡ µÇ°Ú³×¿ä. ±×·±µ¥ vertexÀÇ ÁÂÇ¥°ªÀº ¹Ýµå½Ã x, y, zÃà 3°³ÀÇ ÁÂÇ¥°ªÀ¸·Î ±¸¼ºµÇ´Âµ¥ ¾ÆÁ÷±îÁö´Â zÃà¿¡ ´ëÇÑ ÁÂÇ¥°ªÀÌ ¾ø½À´Ï´Ù. ÁöÇüÀ» ±×¸®´Âµ¥ ÀÖ¾î¼ zÃà ÁÂÇ¥°ªÀº ³ôÀÌ(height)°ªÀ̶ó ºÎ¸£±âµµ Çϸç ÁöÇü Ç¥ÇöÇϴµ¥ ÀÖ¾î¼ °¡Àå Áß¿äÇÑ µ¥ÀÌÅÍ ÀÔ´Ï´Ù. 4*3, Áï 12°³ÀÇ vertex¿¡ ´ëÇØ zÃà ÁÂÇ¥°ªÀ» ÁöÁ¤ÇØÁÖ±â À§ÇØ Àü¿ª º¯¼ö¸¦ Çϳª ´õ Ãß°¡ÇØÁÝ´Ï´Ù.
int[,] heightdata;
±×¸®°í, ÀÌ 2Â÷¿ø ¹è¿¿¡ zÃà ÁÂÇ¥°ªÀ» ä¿öÁÖ±â À§ÇØ ´ÙÀ½°ú °°Àº »õ·Î¿î ÇÔ¼ö¸¦ ¸¸µì´Ï´Ù.
private void LoadHeightData() { heightdata = new int[WIDTH, HEIGHT]; heightdata[0,0] = 0; heightdata[1,0] = 0; heightdata[2,0] = 0; heightdata[3,0] = 0; heightdata[0,1] = 1; heightdata[1,1] = 0; heightdata[2,1] = 2; heightdata[3,1] = 2; heightdata[0,2] = 2; heightdata[1,2] = 2; heightdata[2,2] = 4; heightdata[3,2] = 2; }
ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù¸é InitializeÇÔ¼ö¿¡¼ È£ÃâÇØ Áà¾ß°ÚÁö¿ä.
protected override void Initialize() { // TODO: Add your initialization logic here base.Initialize(); LoadHeightData(); SetupXNADevice(); SetupVertices(); SetupIndices(); SetupCamera(); }
À¯ÀÇÇÒ Á¡Àº ¹Ýµå½Ã SetupVerticesÇÔ¼ö¿Í SetupIndicesÇÔ¼ö Àü¿¡ È£ÃâµÇ¾î¾ß ÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù.
ÀÌÁ¦ ¿ì¸®´Â vertexµéÀ» ¸¸µé ¼ö ÀÖ½À´Ï´Ù. Áö±Ý±îÁö¿Í °°ÀÌ SetupVerticesÇÔ¼ö¸¦ ¼öÁ¤ÇÏ´Â °ÍÀ¸·Î ½±°Ô 4*3=12°³ÀÇ vertexµéÀ» Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù. ´Ù¸¸, ¾ÆÁ÷ zÃà ÁÂÇ¥°ªÀº ¾²Áö ¾Ê±â·Î ÇսôÙ. zÃà ÁÂÇ¥°ªÀº Àá½Ã ÈÄ¿¡ Àû¿ëÇϰڽÀ´Ï´Ù.
private void SetupVertices() { vertices = new VertexPositionColor[WIDTH * HEIGHT]; for (int x = 0; x < WIDTH; x++) { for (int y = 0; y < HEIGHT; y++) { vertices[x + y * WIDTH].Position = new Vector3(x, y, 0); vertices[x + y * WIDTH].Color = Color.White; } } vb = new VertexBuffer(device, VertexPositionColor.SizeInBytes * WIDTH * HEIGHT, ResourceUsage.WriteOnly, ResourceManagementMode.Automatic); vb.SetData(vertices); }
2°³ÀÇ ÁßøµÈ ¹Ýº¹¹®À¸·Î ¿ì¸®´Â ºñ±³Àû °£´ÜÇÏ°Ô 12°³ÀÇ vertex¿¡°Ô °¢°¢ÀÇ ÁÂÇ¥°ª°ú »ö»ó°ªÀ» ÁöÁ¤Çß½À´Ï´Ù. vertex buffer¿¡ ¹è¿À» ÀúÀåÇÒ ¶§ bufferÀÇ Å©±â¸¦ Á¤È®ÇÏ°Ô ÁöÁ¤ÇØ¾ß ÇÔÀ» ±â¾ïÇØµÎ±â ¹Ù¶ø´Ï´Ù. (VertexPositionColor.SizeInBytes * WIDTH * HEIGHT)
´ÙÀ½Àº Á¶±Ý ¾î·Á¿î ÀÛ¾÷ÀÔ´Ï´Ù. 12°³ÀÇ vertexµéÀ» »ï°¢ÇüÀ¸·Î ¿¬°áÇØÁÖ´Â index buffer¸¦ ÀÛ¼ºÇؾßÇÕ´Ï´Ù. °¡Àå ÁÁÀº ¹æ¹ýÀº 12°³ÀÇ vertexµéÀ» µÎ °³ÀÇ »ï°¢ÇüµéÀÇ ¹À½À¸·Î ³ª´©¾î ´Ù·ç´Â °Í ÀÔ´Ï´Ù. ´ÙÀ½ ±×¸²À» »ìÆìº¾½Ã´Ù.
ÀÏ´Ü, ¿ì¸®´Â ±½Àº ½Ç¼±À¸·Î ±×·ÁÁø »ï°¢ÇüµéÀ» ¸ÕÀú ±×·Áº¸µµ·Ï ÇϰڽÀ´Ï´Ù. À̸¦ À§ÇØ SetupIndicesÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ¾ß ÇÕ´Ï´Ù.
private void SetupIndices() { int[] indices = new int[(WIDTH - 1) * (HEIGHT - 1) * 3]; for (int x = 0; x < WIDTH; x++) { for (int y = 0; y < HEIGHT - 1; y++) { indices[(x + y * (WIDTH - 1)) * 3 + 0] = (x + 1) + (y + 1) * WIDTH; indices[(x + y * (WIDTH - 1)) * 3 + 1] = (x + 1) + (y + 0) * WIDTH; indices[(x + y * (WIDTH - 1)) * 3 + 2] = (x + 0) + (y + 0) * WIDTH; } } ib = new IndexBuffer(device, sizeof(int), (WIDTH - 1) * (HEIGHT -1) * 3, ResourceUsage.WriteOnly, ResourceManagementMode.Automatic); ib.SetData(indices); }
±×¸²À» »ìÆìº¸¸é ¾Ë ¼ö ÀÖÁö¸¸ ±×·Á¾ß ÇÏ´Â vertexÀÇ °³¼ö´Â 12°³Áö¸¸ ±×¸± »ï°¢ÇüÀÇ °³¼ö´Â 6°³ÀÔ´Ï´Ù. (=(4-1)*(3-1)=6) ±×¸®°í ÇϳªÀÇ »ï°¢ÇüÀº 3°³ÀÇ vertex·Î ±¸¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ÇÊ¿äÇÑ indexÀÇ °³¼ö´Â 18°³ ÀÔ´Ï´Ù. (=(4-1)*(3-1)*3 = 18) Áï ¿ì¸®´Â 12°³ÀÇ vertex¸¦ »ç¿ëÇÏ´Â 18°³ÀÇ index·Î 6°³ÀÇ »ï°¢ÇüÀ» ±×¸®´Â °Í ÀÔ´Ï´Ù. ¶ÇÇÑ 18°³ÀÇ index¸¦ ÁöÁ¤ÇÒ ¶§, ¿ì¸®´Â ´Ù½Ã±Ý culling¿¡ ´ëÇØ¼ ±â¾ïÇØ³»¾ß ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. Ä«¸Þ¶óÀÇ ½ÃÁ¡¿¡¼ º¼ ¶§ ½Ã°è ¹æÇâ(clock-wise)À¸·Î ±×·ÁÁø »ï°¢Çü¸¸ÀÌ È¸é¿¡ Ç¥½ÃµÈ´Ù´Â »ç½Ç(culling)Àº ¾ðÁ¦ ¾îµð¼³ª Åë¿ëµÇ´Â Áø¸®À̰í ÁöÇüÀ» ±×¸± ¶§µµ ¿ª½Ã ¸¶Âù°¡Áö ÀÔ´Ï´Ù. ÄÚµåÀÇ ¼ö½ÄÀº ÀÌ ¹ýÄ¢À» ÁؼöÇϰí ÀÖ½À´Ï´Ù. ù ¹øÂ° index´Â top-right À§Ä¡ÀÇ vertex, µÎ ¹øÂ° index´Â bottom-right, ¼¼ ¹øÂ° index´Â bottom-left À§Ä¡ÀÇ vertexÀÔ´Ï´Ù. ÄÚµåÀÇ ¼ö½Ä°ú data¸¦ ºñ±³Çغ¸¸é ±Ý¹æ ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ¸¶Áö¸·À¸·Î index bufferÀÇ Å©±â¸¦ ¼öÁ¤ÇØ ÁÖ´Â Àϵµ Àؾ ¾ÈµË´Ï´Ù.
ÀÌÁ¦ vertex buffer¿Í index buffer°¡ ¸ðµÎ ÁغñµÇ¾ú½À´Ï´Ù. Áö±Ý±îÁöÀÇ °á°ú¸¦ ȸ鿡 ¶ç¿öº¾½Ã´Ù. ´Ù¸¸ ±× Àü¿¡ DrawÇÔ¼ö¸¦ ¾à°£ ¼öÁ¤ÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù. DrawÇÔ¼ö¿¡¼ »ï°¢ÇüÀ» ±×¸®´Â ÄÚµåÀÎ DrawIndexedPrimitiveÇÔ¼öÀÇ parameter¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ ÁݽôÙ.
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, WIDTH * HEIGHT, 0, (WIDTH - 1) * (HEIGHT - 1));
12(=4*3)°³ÀÇ vertex¸¦ »ç¿ëÇÏ¿© 6(=(4-1)*(3-1))°³ÀÇ »ï°¢ÇüÀ» ±×¸®´Â ÄÚµåÀÔ´Ï´Ù.
¸¶Áö¸·À¸·Î °á°ú¸¦ Á» ´õ °¡±îÀ̼ »ìÆìº¸±â À§ÇØ Ä«¸Þ¶óÀÇ À§Ä¡¸¦ ¿Å°ÜµÓ½Ã´Ù. ¿©±â¼´Â zÃà ÁÂÇ¥°ªÀ» 15.0f·Î ¼öÁ¤Çß½À´Ï´Ù. SetupCameraÇÔ¼öÀÇ Ä«¸Þ¶ó view matrix »ý¼º Äڵ带 ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÕ´Ï´Ù.
Matrix viewMatrix = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 15.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
ÀÌÁ¦ µð¹ö±×(F5)۸¦ ´©¸£¸é 6°³ÀÇ »ï°¢ÇüÀ¸·Î ¿ì¸®°¡ ±×¸± ÁöÇüÀÇ Àý¹ÝÀÌ Ç¥ÇöµÇ¾î ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.
ȸ鿡´Â 6°³ÀÇ »ï°¢ÇüÀÌ ±×·ÁÁ® ÀÖÀ» °Í ÀÔ´Ï´Ù. ÀÌ »ï°¢ÇüµéÀº ¿ì¸®°¡ ÃÖÁ¾ÀûÀ¸·Î Ç¥ÇöÇϰíÀÚ ÇÏ´Â ÁöÇüÀÇ Àý¹ÝÀÔ´Ï´Ù.
ÀÌÁ¦ ³ª¸ÓÁö 6°³ÀÇ »ï°¢ÇüÀ» ±×¸®´Â °Í°ú µ¿½Ã¿¡, zÃà ÁÂÇ¥°ª ¶ÇÇÑ Àû¿ëÇØ º¾½Ã´Ù. Ä«¸Þ¶ó¸¦ zÃàÀÇ À§Ä¡·Î ¿Å°Üº¸¸é È®ÀÎÇÒ ¼ö ÀÖÁö¸¸, Áö±ÝÀº ¸ðµç vertex°¡ µ¿ÀÏÇÑ zÃà ÁÂÇ¥°ªÀ» °¡Áö°í ÀÖÀ¸¹Ç·Î ¸ðµç ¸éÀº ÆòÆòÇÑ(=flat=same level) »óÅÂÀÔ´Ï´Ù. ÁöÇüÀÇ zÃà ÁÂÇ¥°ªÀÎ heightdata¸¦ vertex¿¡ Àû¿ëÇØ º¾½Ã´Ù. SetupVerticesÀÇ vector¸¦ ÁöÁ¤ÇÏ´Â Äڵ带 ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÕ´Ï´Ù.
vertices[x + y * WIDTH].Position = new Vector3(x, y, heightdata[x,y]);
´ÙÀ½Àº ³ª¸ÓÁö 6°³ÀÇ »ï°¢ÇüÀ» ¸¶Àú ±×¸®°Ú½À´Ï´Ù. SetupIndicesÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÕ´Ï´Ù.
private void SetupIndices() { int[] indices = new int[(WIDTH - 1) * (HEIGHT - 1) * 3 * 2]; for (int x = 0; x < WIDTH - 1; x++) { for (int y = 0; y < HEIGHT - 1; y++) { indices[(x + y * (WIDTH - 1)) * 3 * 2 + 0] = (x + 1) + (y + 1) * WIDTH; indices[(x + y * (WIDTH - 1)) * 3 * 2 + 1] = (x + 1) + (y + 0) * WIDTH; indices[(x + y * (WIDTH - 1)) * 3 * 2 + 2] = (x + 0) + (y + 0) * WIDTH; indices[(x + y * (WIDTH - 1)) * 3 * 2 + 3] = (x + 1) + (y + 1) * WIDTH; indices[(x + y * (WIDTH - 1)) * 3 * 2 + 4] = (x + 0) + (y + 0) * WIDTH; indices[(x + y * (WIDTH - 1)) * 3 * 2 + 5] = (x + 0) + (y + 1) * WIDTH; } } ib = new IndexBuffer(device, typeof(int), (WIDTH - 1) * (HEIGHT -1) * 3 * 2, ResourceUsage.WriteOnly, ResourceManagementMode.Automatic); ib.SetData(indices); }
6°³ »ï°¢ÇüÀÇ 2¹À½, 12°³ÀÇ »ï°¢ÇüÀ» ±×¸®±â À§ÇØ *3 µÚ¿¡ *2¸¦ Ãß°¡ÇÏ°í ´Ã¾î³ index¸¦ Ãß°¡·Î ÁöÁ¤ÇØ ÁÖ¾ú½À´Ï´Ù. »ï°¢ÇüÀ» Ãß°¡·Î ±×¸®±â À§Çؼ´Â ¹è¿ÀÇ Å©±â¿¡ Ç×»ó ½Å°æÀ» ½á¾ß ÇÕ´Ï´Ù. ¹°·Ð Ãß°¡µÇ´Â µÎ ¹øÂ° »ï°¢Çü ¹À½µµ vertex¸¦ ±×¸®´Â ¼ø¼´Â ½Ã°è ¹æÇâÀÌ µÇ¾î¾ß ÇÒ °ÍÀÔ´Ï´Ù. (culling) data¿Í vertex°¡ ±×·ÁÁö´Â ¼ø¼¸¦ ºñ±³Çغ¸±æ ¹Ù¶ø´Ï´Ù.
drawÇÔ¼ö ¶ÇÇÑ ¼öÁ¤ÇØÁݽôÙ. DrawIndexedPrimitivesÇÔ¼öÀÇ parameter Áß, »ï°¢ÇüÀÇ °³¼ö¿¡ *2¸¦ ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù.
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, WIDTH * HEIGHT, 0, (WIDTH - 1) * (HEIGHT - 1) * 2);
ÀÌÁ¦ µð¹ö±×(F5)۸¦ ´©¸£¸é 12(=4*3)°³ÀÇ vertex·Î 12(=(4-1)*(3-1)*2)°³ÀÇ »ï°¢ÇüÀ» ±×·Á Ç¥ÇöµÈ ÁöÇüÀÌ ³ªÅ¸³¯ °Í ÀÔ´Ï´Ù.
- Website design & XNA + DirectX code : Riemer Grootjans - ©2003 - 2008 Riemer Grootjans
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2007 - 2008 MVP Award DirectX - XNA
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Support this site -- any amount is welcome !
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|