XNA for C#
DirectX 9 for C#
DirectX 9 for C++
DirectX 9 for VB
Forum
   
My XNA Book
      
       Go to section on this site

Additional info


Latest Forum posts

 Account settings
  Posted by: Anonymous
  When: 07/05/2014 at 09:48:39

 forced subtitle
  Posted by: Applefly
  When: 07/05/2014 at 06:00:48

 convert DVD into PMS
  Posted by: Applefly
  When: 07/05/2014 at 05:55:25

 DVD to Digital Copy easily
  Posted by: VIKIVannessa
  When: 05/05/2014 at 06:52:29

 DVD on Xbox 360/Xbox One Console
  Posted by: VIKIVannessa
  When: 05/05/2014 at 06:51:47

 Extract .Srt Subtitles
  Posted by: Applefly
  When: 04/05/2014 at 03:54:38

 Encode Movie collection
  Posted by: Applefly
  When: 04/05/2014 at 03:52:41

 Convert DVD to WMV
  Posted by: Applefly
  When: 29/04/2014 at 05:53:50

 rip DVDs into digital files
  Posted by: Applefly
  When: 29/04/2014 at 05:51:20

 iTunes movies/music to Kindle Fire
  Posted by: ciciyu80
  When: 29/04/2014 at 05:10:20


Ads

색을 입히기 그리고 Z-buffer

이번 tutorial에서는 wireframe으로 구성된 지형에 색을 입혀보겠습니다. 그리고 좀 더 보기 좋게 입히기 위해 실제 자연의 색과 비슷하게 색을 구성해보겠습니다. 실제 지형의 예를 보면, 아마도 아래로 푹 파인 지대는 파란색 호수가 있고 지상 위 낮은 지대에는 푸른색 풀과 나무들이 존재하며 산 중턱은 갈색 흙으로, 가장 높은 산 꼭대기에는 하얀색 눈이 존재할 것 입니다. 우리의 지형에도 이러한 색을 입히기 위해 높이를 그 값에 따라 4단계로 나누어 아래부터 파란색, 녹색, 갈색, 하얀색을 차례로 해당 영역의 vertex에 적용하겠습니다.

새 Windows Game 프로젝트를 생성하고 필요한 파일을 준비합시다.

가장 먼저 해야 할 일은 최대 높이와 최소 높이를 정의하는 것 입니다. 얼핏 생각하기에 heightmap의 최대값이 255이고 최소값이 0이기 때문에 이것을 그대로 최대 높이, 최소 높이라고 생각하기에 쉬운데 사실 항상 그런 것은 아닙니다. 우리의 지형의 경우 최대 높이를 255, 최소 높이를 0으로 가정하고 4단계로 나누면 파란색 부분과 하얀색 부분의 영역이 지형에 존재하지 않습니다. 우리가 원하는 결과가 아니지요. 따라서 현재 그려지는 지형의 최대 높이와 최소 높이를 가져와서 그 사이를 4단계로 나누어 주어야 합니다.

최대 높이와 최소 높이를 저장할 전역 변수를 선언합니다. 일단 초기값은 최대 높이는 255, 최소 높이는 0을 주겠습니다.

 int minimumheight = 255;
 int maximumheight = 0;

LoadHeightData함수의 높이값을 저장하는 부분에 다음과 같이 최대 높이와 최소 높이를 구하는 코드를 추가합니다.

 heightdata[WIDTH - 1 - x, HEIGHT - 1 - y] = height;
 
 if (height < minimumheight)
     minimumheight = height;
 if (height > maximumheight)
     maximumheight = height;

이제 최대 높이와 최소 높이 사이의 영역을 4등분해야 합니다.



기존의 하얀색으로 vertex의 색상값을 지정하는 코드를 다음과 같이 수정합시다.

 vertices[x + y * WIDTH].Position = new Vector3(x, y, heightdata[x,y]);
 
 if (heightdata[x, y] < minimumheight + (maximumheight - minimumheight) * 1 / 4)
     vertices[x + y * WIDTH].Color = Color.Blue;
 else if (heightdata[x, y] < minimumheight + (maximumheight - minimumheight) * 2 / 4)
     vertices[x + y * WIDTH].Color = Color.Green;
 else if (heightdata[x, y] < minimumheight + (maximumheight - minimumheight) * 3 / 4)
     vertices[x + y * WIDTH].Color = Color.Brown;
 else
     vertices[x + y * WIDTH].Color = Color.White;

해당 코드는 최소 높이값과 최대 높이값 사이를 4등분하여 각 영역의 vertex의 색상값을 Blue, Green, Brown, White로 지정합니다.

현재는 line으로 지형이 표현되어 있기 때문에(wireframe), 색이 입혀진 지형을 표현하기 위해 다음의 코드를 삭제하겠습니다.

 device.RenderState.FillMode = FillMode.WireFrame;

위의 코드를 삭제하면 FillMode는 자동으로 기본값인 Solid로 설정됩니다. 혹은 FillMode.Solid와 같이 직접 설정해주어도 상관없습니다.

F5(디버그)키를 눌러 실행 시킨 후 지형을 몇 번 회전시켜 봅시다. PC의 그래픽 카드에 따라 결과가 다르게 나타날 수 있지만 아마도 지형이 제대로 나타나지 않거나 지형상 봉우리에 해당하는 영역이 가려져 보이지 않아야 하는 호수 등의 영역 뒤에 겹쳐 그려져 매우 이상하게 보일 것 입니다. 이는 아직 Z-buffer가 설정되지 않았기 때문입니다. Z-buffer는 단순하게 여러분의 그래픽 카드가 어느 vertex들를 어느 vertex들 위에 그려야 하는지 순서를 저장하고 있는 깊이의 좌표값 배열일 뿐입니다. 예를 들어 지금 우리의 지형을 그래픽 카드가 그릴 때 우리는 간단히 우리의 시선(카메라)을 기준으로 앞에 있는 삼각형(봉우리 영역)이 뒤에 있는 삼각형(호수 영역)을 가리고 있음을 판단할 수 있지만, 그래픽 카드는 그렇지 못합니다. 그래픽 카드의 입장에서는 Z-buffer가 없다면 두 삼각형의 우선 순위를 판단하지 못하고 동시에 같은 위치에 두 삼각형을 겹쳐 그리게 되므로 결과적으로 지금과 같이 매우 이상한 화면이 출력됩니다.

하지만 다행히도 우리의 지형에 Z-buffer를 설정하는 방법은 매우 간단합니다. 그저 Draw함수의 device.Clear 함수를 다음과 같이 수정하여 Z-buffer를 설정해 주기만 하면 됩니다. 나머지 일은 모두 여러분의 그래픽 카드의 몫이지요.

 device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1.0f, 0);

이제 F5(디버그)키를 눌러봅시다.






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 - 2011 Riemer Grootjans
Translations

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

Microsoft MVP Award



2007 - 2011 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!