이번엔 2차원 도형 출력이다!
주황색으로 표시된 부분이 새로 추가된 부분이고 나머지는 기본 골격에서 벗어나지 않는다.
this.CreateFont();는 3강 글자출력에서 했던 부분을 메서드화 시켜놓은 것
MDX.cs
namespace ddrawexercise
{
public partial class MDX : IDisposable // 관리되지 않는 리소스 해제
{
private CustomVertex.TransformedColored[] _vertices = new CustomVertex.TransformedColored[3];
// 탑레벨 윈도우 : 모든 초기화가 OK면 true, 하나라도 실패하면 false를 리턴한다.
// false를 리턴하게되면 자동으로 종료된다.
public bool InitializeApplication(Form1 topLevFORM)
{
this._form = topLevFORM; // 폼의 참조를 보관, 유지
try
{
this.CreateDevice(topLevFORM);
this.CreateFont();
this._vertices[0] = new CustomVertex.TransformedColored(200.0f, 50.0f, 0.0f, 1.0f, Color.Red.ToArgb());
this._vertices[1] = new CustomVertex.TransformedColored(350.0f, 50.0f + 150.0f * (float)Math.Sqrt(3), 0.0f, 1.0f, Color.Blue.ToArgb());
this._vertices[2] = new CustomVertex.TransformedColored(50.0f, 50.0f + 150.0f * (float)Math.Sqrt(3), 0.0f, 1.0f, Color.Green.ToArgb());
}
catch(DirectXException ex)
{
MessageBox.Show(ex.ToString(), "에러", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return true;
}
public void MainLoop() // 메인루프
{
//화면을 파란색으로 클리어, 클리어 하지 않으면 전에 출력된 내용이 남는다
this._device.Clear(ClearFlags.Target, Color.DarkBlue, 1.0f, 0);
// flags : 클리어 하는 내용 지정, color : 클리어 할 색, 나머지는 z버퍼와 스탠실버퍼 통상 1.0과 0
this._device.BeginScene();
// beginScene과 endScene사이에 그릴 내용을 코딩한다
this._font.DrawText(null, "DirectX 2D 샘플^^", 0, 0, Color.White);
this._device.VertexFormat = CustomVertex.TransformedColored.Format;
this._device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, this._vertices);
this._device.EndScene();
this._device.Present(); // 실제 디바이스에 출력
}
public void Dispose() // 자원의 파기
{
if (this._device != null)
{
this._device.Dispose();
} // Direct 3D 디바이스의 자원 해제
}
}
}
private CustomVertex.TransformedColored[] _vertices = new CustomVertex.TransformedColored[3];
2D 좌표변화가 끝난 정점 데이터 형식, 3D에서는 사용할 수 없어요
좌표변화가 끝난 정점 데이터 : 2D 다각형을 표시하는데 사용할 수 있는 것
CustomVertex.TransformedColored 구조체 내부 구성 요소
X : 화면 좌표의 X
Y : 화면 좌표의 Y
Z : 삼도치, 통상 1.0 or 0.0
Rhw : 다음 w의 역수, 통상 1.0
Color : 정점의 색
this._vertices[0] = new CustomVertex.TransformedColored(200.0f, 50.0f, 0.0f, 1.0f, Color.Red.ToArgb());
this._vertices[1] = new CustomVertex.TransformedColored(350.0f, 50.0f + 150.0f * (float)Math.Sqrt(3), 0.0f, 1.0f, Color.Blue.ToArgb());
this._vertices[2] = new CustomVertex.TransformedColored(50.0f, 50.0f + 150.0f * (float)Math.Sqrt(3), 0.0f, 1.0f, Color.Green.ToArgb());
3정점 데이터 설정
위에서 설명한대로 구조체의 내용대로 하부속성을 써주면 된다.
Xvalue : 실제 화면의 x좌표, 제일 왼쪽이 0 그리고 오른쪽으로 가는 만큼 커집니다.
Yvalue : 실제 화면의 y좌표, 맨위가 0 아래로 내려갈 수록 커진다.
Zvalue : 삼도치, 2D에서는 관계가 없어요
rhwValue : 다음 w의 역수,,, 일단은 뭔뜻인지 나중에 알기로하고 1.0f로 세팅
c : 정점의 색, 정점과 정점 사이의 색은 자동 선형 보간됩니다.
위치 지정으로 Math.Sqrt (루트) 메서드를 사용하고 있는데, 이는 정삼각형을 만들기 위해서 정확한 값을 내려고 사용했다.
this._device.VertexFormat = CustomVertex.TransformedColored.Format;
this._device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, this._vertices);
메인 루프의 그리기 부분
최초로 디바이스의 어떠한 정점 데이터를 사용할 지를 나타낸다. 여기서는 device.VertexFormat의 유연한 정점 포맷을 지정합니다. 요고는 CustomVertex.TransformedColored.Format에 이미 정의되었으니 요고를 써주면 된다.
그 후 (2번째 줄) 다각형의 랜더링을 실시한다.
Device.DrawUserPrimitives 메서드 속성
primitiveType : 랜더링하는 소스 타입을 지정한다, 소스는 점이나 선 면으로 PrimitiveType 열거형에서 지정합니다. 여기서는 삼각형 하나니까 PrimitiveType.TriangleList로 설정!
primitiveCount : 랜더링하는 소스의 개수, 삼각형 "한개"니까 1로 설정
vertexStreamZeroData : 작성한 정점 데이터를 건네준다.
'Graphics > DirectX' 카테고리의 다른 글
Direct X - 6. 좌표 변화 세가지 (월드, 뷰, 투영) (0) | 2014.06.01 |
---|---|
Direct X - 5. 정점버퍼를 이용한 삼각형 출력 (0) | 2014.06.01 |
Direct X - 3. 글자출력 (0) | 2014.06.01 |
Direct X - 2. 초기화와 기본처리 (0) | 2014.06.01 |
Direct X - 1. 기본설정 (0) | 2014.06.01 |