XNA for C#
DirectX 9 for C#
DirectX 9 for C++
DirectX 9 for VB
Forum
   September 24: 2D-19: Particle engine
My Book: Out Now!
      
       Go to section on this site

Additional info


Latest Forum posts

 Next Chapter
  Posted by: jasonbarry
  When: 15/10/2008 at 15:55:47

 HLSL: compilation fails
  Posted by: aguacate
  When: 15/10/2008 at 12:03:19

 my collision sucks!
  Posted by: orgad
  When: 15/10/2008 at 11:25:49

 HLSL: compilation fails
  Posted by: aguacate
  When: 15/10/2008 at 11:16:55

 Flickering/glitches
  Posted by: Danzence
  When: 15/10/2008 at 09:53:00

 Next Chapter
  Posted by: samer
  When: 15/10/2008 at 06:40:32

 Flickering/glitches
  Posted by: samer
  When: 15/10/2008 at 06:39:17

 Texture terrian c++
  Posted by: ruudriem
  When: 15/10/2008 at 05:55:16

 1.7 and 2.8 problem.
  Posted by: riemer
  When: 15/10/2008 at 03:36:34

 Next Chapter
  Posted by: riemer
  When: 15/10/2008 at 03:34:29


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)°³ÀÇ »ï°¢ÇüÀ» ±×·Á Ç¥ÇöµÈ ÁöÇüÀÌ ³ªÅ¸³¯ °Í ÀÔ´Ï´Ù.






Google
 
Webwww.riemers.net


If you appreciate the amount of time I spend creating and updating
these pages, feel free to donate -- any amount is welcome !



- Website design & XNA + DirectX code : Riemer Grootjans -
©2003 - 2008 Riemer Grootjans
Translations

This site in English
This site in Korean
This site in Czech

Microsoft MVP Award



2007 - 2008 MVP Award
DirectX - XNA

Contents

[Tutorials]
[XNA in C#]
Series 1: ÁöÇü
XNAÀÇ ½ÃÀÛ
ÀÌÆåÆ® ÆÄÀÏ
ù ¹øÂ° »ï°¢Çü
¿ùµå ÁÂÇ¥°è
ȸÀü, À§Ä¡ º¯È¯
À妽º
ÁöÇü »ý¼ºÀÇ ±âº»
ÆÄÀϷκÎÅÍ ÁöÇü »ý¼º
Űº¸µå ÀÔ·Â
[tut10]
[tut11]
[tut12]
[tut13]
-- Expand all --


Thank you!

Support this site --
any amount is welcome !

Stay up-to-date

I don't have the time to keep a News section, so stay informed about the updates by clicking on this RSS file!