Graphics/DirectX

Direct X - 4. 2차원 도형 출력

MOLOKINI 2014. 6. 1. 21:03
이번엔 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 : 작성한 정점 데이터를 건네준다.