|
|
|
|

Áö±Ý±îÁö ¿ì¸®´Â ÁöÇü¿¡ »öÀ» Ä¥Çϰí Z-buffer¸¦ ¼³Á¤ÇÏ¿© ²Ï ±×·²½ÎÇÏ°Ô º¸ÀÌ°Ô ¸¸µé¾î º¸¾Ò½À´Ï´Ù. ¾Æ¸¶µµ ¿©±â¿¡ Á¶¸íÀ» ´õÇÏ¸é ´õ¿í ±×·²½ÎÇØ º¸ÀÏ °ÍÀÔ´Ï´Ù. À̹ø tutorial¿¡¼´Â °£´ÜÇÏ°Ô µÎ °³ÀÇ »ï°¢ÇüÀ» ¸¸µé°í ¿©±â¿¡ Á¶¸íÀ» ¼³Á¤ ÇØº¸°Ú½À´Ï´Ù.
ÁöÇü¿¡ Á¶¸íÀ» Àû¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡ À̹ø tutorial¿¡¼´Â ÀÌÀü tutorialÀÌ ¾Æ´Ñ 4¹øÂ° tutorialÀÎ World Space¿¡¼ ½ÃÀÛÇϰڽÀ´Ï´Ù. »õ Windows Game ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇϰí ÇØ´ç tutorial¿¡¼ ÇÊ¿äÇÑ ÆÄÀϵéÀ» º¹»çÇØ ¿É½Ã´Ù.
À̹ø tutorial¿¡¼ ¿ì¸®´Â Á÷»ç±¤(directional light)À» »ç¿ëÇÕ´Ï´Ù. ž籤(sunlight)¸¦ »ó»óÇØ º¾½Ã´Ù. Á÷»ç±¤Àº ž籤°ú °°ÀÌ ¸ðµç ºûÀÌ ÇϳªÀÇ µ¿ÀÏÇÑ ¹æÇâÀ¸·Î ÇâÇØ ÀÖ½À´Ï´Ù. ºûÀÌ »ï°¢Çü Ç¥¸é¿¡ ¹Ý»çµÇ´Â È¿°ú¸¦ °è»êÇϱâ À§ÇØ XNA¿¡¼´Â ¸ðµç vertex¸¶´Ù normal°ªÀ» ÇÊ¿ä·Î ÇÏ°Ô µË´Ï´Ù.
´ÙÀ½ ±×¸²À» »ìÆìº¾½Ã´Ù.
¸¸¾à ¿ì¸®°¡ a)¿Í °°Àº ±¤¿øÀ» »ç¿ëÇϰí, 3°³ÀÇ Ç¥¸é¿¡ ºñÃß°í ÀÖ´Ù¸é XNA´Â ¾î¶»°Ô 1¹ø Ç¥¸éÀÌ 3¹ø Ç¥¸éº¸´Ù ´õ ¹à°Ô ºû³ª´ÂÁö ¾Ë ¼ö ÀÖÀ»±î¿ä? (¹°·Ð ¿ì¸®ÀÇ ´«¿¡´Â ´ç¿¬ÇÑ »ç½ÇÀÌÁö¿ä.) b)¿¡¼ º¸ÀÌ´Â ºÓÀº»ö ¼±µéÀÇ ±æÀÌ´Â °¢ Ç¥¸éµéÀÌ ¹Ý»çÇØ¾ß ÇÒ ºûÀÇ ¾çÀ» ¾ÆÁÖ Àß ³ªÅ¸³»°í ÀÖ½À´Ï´Ù. ±×·¸´Ù¸é ÀÌ ºÓÀº»ö ¼±µéÀÇ ±æÀÌ´Â ¾î¶»°Ô °è»êÇÒ ¼ö ÀÖÀ»±î¿ä? »ç½ÇÀº, XNA°¡ ÀÌ °è»êÀ» ÇØÁÝ´Ï´Ù. b)¿¡¼ º¸ÀÌ´Â ÆÄ¶õ»ö È»ìÇ¥µé°ú ºÓÀº»ö ¼±µé°úÀÇ °ü°è¸¦ »ìÆìº¸¸é ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ½À´Ï´Ù. (°£´ÜÇÑ cosine Åõ¿µÀÌÁö¿ä.)
À̰ÍÀÌ ¿ì¸®ÀÇ vector¿¡ NormalÀÌ ÇÊ¿äÇÑ ÀÌÀ¯ ÀÔ´Ï´Ù. µû¶ó¼ ¿ì¸®´Â ´õ ÀÌ»ó VertexPositionColor¸¦ ¾²Áö ¾ÊÀ» °Í ÀÌÁö¸¸ ºÒÇàÈ÷µµ XNA´Â À§Ä¡°ª(Position)°ú »ö»ó°ª(Color), ±×¸®°í NormalÀ» ¸ðµÎ ´ã°í ÀÖ´Â ±¸Á¶Ã¼(Struct)¸¦ Á¦°øÇÏÁö ¾Ê½À´Ï´Ù. ±×·¯³ª ½±°Ô ¿ì¸®°¡ »õ·Î¿î ±¸Á¶Ã¼¸¦ ¸¸µé¾î ¾µ ¼ö ÀÖÀ¸¹Ç·Î ±×¸® Å« ¹®Á¦´Â ¾Æ´Õ´Ï´Ù. ¿ì¸® ÀÔ¸À¿¡ ¸Â´Â ±¸Á¶Ã¼¸¦ ¸¸µé±â À§ÇØ Class °¡Àå »ó´Ü¿¡ ´ÙÀ½°ú °°Àº Äڵ带 Ãß°¡ÇսôÙ.
public struct VertexPositionNormalColored { public Vector3 Position; public Color Color; public Vector3 Normal; public static int SizeInBytes = 7 * 4; public static VertexElement[] VertexElements = new VertexElement[] { new VertexElement( 0, 0, VertexElementFormat.Vector3, VertexElementMethod.Default, VertexElementUsage.Position, 0 ), new VertexElement( 0, sizeof(float) * 3, VertexElementFormat.Color, VertexElementMethod.Default, VertexElementUsage.Color, 0 ), new VertexElement( 0, sizeof(float) * 4, VertexElementFormat.Vector3, VertexElementMethod.Default, VertexElementUsage.Normal, 0 ), }; }
¾ð¶æ º¸±â¿¡ º¹ÀâÇØ º¸ÀÌ´Â ±¸Á¶Ã¼ÀÌÁö¸¸ »ç½ÇÀº óÀ½ 3ÁÙÀÇ ¶óÀθ¸ ÀÌÇØÇÏ¸é µË´Ï´Ù. VertexPositionNormalColored±¸Á¶Ã¼´Â Position, Color, NormalÀ» ¸ðµÎ ´ã°í ÀÖ½À´Ï´Ù. SizeInByteÇʵå´Â ¿©±â¼´Â »ç¿ëÇÏÁö ¾ÊÁö¸¸ ÃßÈÄ IndexBuffer¸¦ ¼³Á¤ÇÒ¶§ 1°³ÀÇ vertex°¡ ¸î byteÀÎÁö ÁöÁ¤ÇØ ÁÙ ¶§ »ç¿ëÇÕ´Ï´Ù. ±×¸®°í ¸¶Áö¸· VertexElements Çʵå´Â VertexPositionNormalColored·Î »ý¼ºµÈ Vertex°¡ °¡Áö°Ô µÉ ¿ä¼Ò(Position, Color, Normal)¸¦ Á¤ÀÇÇÕ´Ï´Ù. ÀÌ ÇÊµå ¶ÇÇÑ IndexBuffer¸¦ »ç¿ëÇÒ ¶§ ÇÊ¿äÇÕ´Ï´Ù. Áö±Ý±îÁö »ç¿ëÇß´ø VertexPositionColor ´ë½Å »õ·Î ¸¸µç VertexPositionNormalColored¸¦ »ç¿ëÇÏ¿© ±âÁ¸ÀÇ vertices Àü¿ª º¯¼ö¸¦ ÀçÁ¤ÀÇ ÇØÁݽôÙ.
VertexPositionNormalColored[] vertices;
ÀÌÁ¦ ±×·Á¾ß ÇÒ »ï°¢ÇüÀ» Normal°ªÀ» Æ÷ÇÔÇÏ¿© ÀçÁ¤ÀÇÇØ¾ß ÇÕ´Ï´Ù. ÇÏÁö¸¸ ±×Àü¿¡ ¸ÕÀú ´ÙÀ½ ±×¸²À» º¸µµ·Ï ÇսôÙ.
¸¸¾à °£´ÜÇÏ°Ô °¢ Ç¥¸é¿¡ Á÷°¢À¸·Î Normal vector¸¦ Á¤ÀÇÇÑ´Ù¸é ¹Ý»çµÇ´Â ºûÀº a)¿¡¼ º¸ÀÌ´Â °Í°ú °°ÀÌ ¸ð¼¸®(edge)¸¦ °¡Áö°Ô µÉ °ÍÀÔ´Ï´Ù. ¿À¸¥ÂÊ Ç¥¸éÀÌ ¿ÞÂÊ Ç¥¸éº¸´Ù ´õ ¸¹Àº ºûÀ» ¹Ý»çÇϱ⠶§¹®ÀÔ´Ï´Ù. ±×¸®°í µÎ Ç¥¸éÀº È®½ÇÈ÷ ºÐ¸®µÇ¾î º¸À̰ÚÁö¿ä. ÇÏÁö¸¸ µÎ Ç¥¸éÀÌ ¸Â´Ý¾Æ ÀÖ´Â ÃÖ»ó´ÜÀÇ Normal vector¸¦ b)¿¡¼ º¸ÀÌ´Â °Í°ú °°ÀÌ Á¤ÀÇÇÑ´Ù¸é XNA´Â µÎ Ç¥¸é¿¡¼ ¹Ý»çµÇ´Â ºûÀ» º¸°£ÇÏ¿© ºûÀÌ ºÎµå·´°Ô ¹Ý»çµÇµµ·Ï ÇÕ´Ï´Ù. ÀÌ vector´Â a)¿¡¼ º¸ÀÌ´Â µÎ »ó´Ü Normal vectorÀÇ Æò±ÕÀÔ´Ï´Ù.
vertexµéÀ» ÀçÁ¤ÀÇ Çϱâ Àü¿¡ camera¸¦ ¸ÕÀú ÀçÁ¤ÀÇ ÇØ ÁݽôÙ.
Matrix viewMatrix = Matrix.CreateLookAt(new Vector3(0, -40, 100), new Vector3(0, 50, 0), new Vector3(0, 1, 0)); Matrix projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, this.Window.ClientBounds.Width / this.Window.ClientBounds.Height, 1.0f, 200.0f);
±×¸®°í SetupVerticesÇÔ¼ö¿¡¼ 2°³ÀÇ »ï°¢ÇüÀ» ±×¸®±â À§ÇÑ 6°³ÀÇ vertexµéÀ» Á¤ÀÇÇØ ÁÝ´Ï´Ù.
private void SetUpVertices() { vertices = new VertexPositionNormalColored[6]; vertices[0].Position = new Vector3(0f, 0f, 50f); vertices[0].Color = Color.Blue; vertices[0].Normal = new Vector3(1, 0, 1); vertices[1].Position = new Vector3(50f, 0f, 00f); vertices[1].Color = Color.Blue; vertices[1].Normal = new Vector3(1, 0, 1); vertices[2].Position = new Vector3(0f, 50f, 50f); vertices[2].Color = Color.Blue; vertices[2].Normal = new Vector3(1, 0, 1); vertices[3].Position = new Vector3(-50f, 0f, 0f); vertices[3].Color = Color.Blue; vertices[3].Normal = new Vector3(-1, 0, 1); vertices[4].Position = new Vector3(0f, 0f, 50f); vertices[4].Color = Color.Blue; vertices[4].Normal = new Vector3(-1, 0, 1); vertices[5].Position = new Vector3(0f, 50f, 50f); vertices[5].Color = Color.Blue; vertices[5].Normal = new Vector3(-1, 0, 1); }
2°³ÀÇ »ï°¢Çü(Ç¥¸é)ÀÌ ¸Â´Ý¾Æ ÀÖµµ·Ï Çß°í zÃà ÁÂÇ¥°ªÀ» ¼³Á¤ÇÏ¿© cameraÀÇ ½Ã¼±¿¡¼ º¼ ¶§ ±â¿ï¾î º¸À̵µ·Ï Çß½À´Ï´Ù. Normal vector´Â À§ ±×¸²ÀÇ a)¿Í °°ÀÌ °¢ vertex¿¡ Á÷°¢À¸·Î ¼³Á¤Çß½À´Ï´Ù.
ÀÌÁ¦ DrawÇÔ¼ö¸¦ ¼öÁ¤ÇÒ Â÷·ÊÀÔ´Ï´Ù. DrawÇÔ¼öÀÇ »ï°¢ÇüÀ» ±×¸®´Â ÇØ´ç Äڵ带 ´ÙÀ½°ú °°ÀÌ ¼³Á¤ ÇսôÙ.
device.VertexDeclaration = new VertexDeclaration(device, VertexPositionNormalColored.VertexElements); device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 2);
¸¶Áö¸·À¸·Î Á¶¸íÀ» ¼³Ä¡ÇØ¾ß ÇÕ´Ï´Ù. DrawÇÔ¼öÀÇ effect.begin() Àü¿¡ ´ÙÀ½°ú °°Àº Äڵ带 Ãß°¡ÇÏ¿© Á¶¸íÀ» ¼³Ä¡ÇÒ ¼ö ÀÖ½À´Ï´Ù.
effect.CurrentTechnique = effect.Techniques["Colored"]; effect.Parameters["xEnableLighting"].SetValue(true); effect.Parameters["xLightDirection"].SetValue(new Vector3(0.5f, 0, -1.0f));
ÀÌ ÄÚµå´Â Á¶¸í °è»êÀ» °¡´ÉÇÏ°Ô Çϰí(À̶§ technique°¡ Normal vector¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù.) ºûÀÌ ºñÃß´Â ¹æÇâÀ» ¼³Á¤ÇÕ´Ï´Ù. Á»´õ º¸±â ÁÁµµ·Ï ¹è°æÀ» °ËÀº»öÀ¸·Î ¼³Á¤ÇÏ´Â °Íµµ ÁÁ°Ú³×¿ä.
ÀÌÁ¦ F5(µð¹ö±×) ۸¦ ´·¯º¸¸é ±×¸²ÀÇ a)¿Í °°ÀÌ ¸ð¼¸®(edge)°¡ ÀÖ´Â µÎ »ï°¢Çü(Ç¥¸é)À» º¸°Ô µÉ °ÍÀÔ´Ï´Ù. ¿ÞÂÊ »ï°¢ÇüÀº ¹à°Ô º¸ÀÌ°í ¿À¸¥ÂÊ »ï°¢ÇüÀº ¾îµÓ°Ô º¸¿© µÎ Ç¥¸éÀÌ È®½ÇÈ÷ ±¸ºÐÀÌ µÉ °ÍÀÔ´Ï´Ù.
À̹ø¿¡´Â µÎ »ï°¢ÇüÀÇ »ó´Ü Normal vector¸¦ Æò±Õ³»¾î ±âÁ¸ vertexµé¿¡ Àû¿ëÇØ º¾½Ã´Ù. (-1.0f, 0.0f, 1.0f)¿Í (1.0f, 0.0f, 1.0f)ÀÇ Æò±ÕÀÎ (-1.0f + 1.0f, 0.0f, 1.0f + 1.0f) / 2 = (0.0f, 0.0f, 1.0f)¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù.
vertices[0].Position = new Vector3(0f, 0f, 50f); vertices[0].Color = Color.Blue; vertices[0].Normal = new Vector3(0, 0, 1); vertices[1].Position = new Vector3(50f, 0f, 00f); vertices[1].Color = Color.Blue; vertices[1].Normal = new Vector3(1, 0, 1); vertices[2].Position = new Vector3(0f, 50f, 50f); vertices[2].Color = Color.Blue; vertices[2].Normal = new Vector3(0, 0, 1); vertices[3].Position = new Vector3(-50f, 0f, 0f); vertices[3].Color = Color.Blue; vertices[3].Normal = new Vector3(-1, 0, 1); vertices[4].Position = new Vector3(0f, 0f, 50f); vertices[4].Color = Color.Blue; vertices[4].Normal = new Vector3(0, 0, 1); vertices[5].Position = new Vector3(0f, 50f, 50f); vertices[5].Color = Color.Blue; vertices[5].Normal = new Vector3(0, 0, 1);
F5(µð¹ö±×)۸¦ ´·¯ ½ÇÇàÇØ º¸¸é ¿ÞÂÊ »ï°¢ÇüÀÇ ¹àÀº ¿µ¿ª¿¡¼ ¿À¸¥ÂÊ »ï°¢ÇüÀÇ ¾îµÎ¿î ¿µ¿ª±îÁö ºûÀÌ ¸Å¿ì ÀÚ¿¬½º·´°Ô ¹Ý»çµÇ°í ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í ÀÌ Á¶¸í È¿°ú¸¦ ¿ì¸®ÀÇ ÁöÇü¿¡ Àû¿ëÇÑ´Ù¸é ¾ÆÁÖ º¸±â ÁÁ°Ú³×¿ä.
- Website design & XNA + DirectX code : Riemer Grootjans - ©2003 - 2008 Riemer Grootjans
|
|
|
|
|