[번역] DirectX 9.0( Managed - .Net 기반) Direct3D Tutorial - 2
출처 : http://www.spirit3d.net/
번역 : jacking@korea.com(최흥배)
Tutirial 2: 정점 렌더링
Microsoft Direct3D에서 만들었던 애플리케이션은, 정점을 사용하여 지오메트릭 형태를 묘화(描 ) 한다.
각 3차원(3D) Scene은, 이와 같은 지오메트릭 형태를 하나 또는 복수 포함하고 있다. Vertices tutorial 프로젝트에서는,
처음에 “Tutorial 1: 디바이스의 작성”의 초기화 순서를 실행하고, 계속해서 가장 단순한 도형인 삼각형을 만들어
디스플레이에 렌더링 한다.
패스
소스의 장소 : (SDK 루트)\Samples\C#\Direct3D\Tutorials\Tutorial2
순서
이 tutorial에서는 3개의 정점을 사용하여 2D의 삼각형을 렌더링 한다. 여기서는, 정점 버퍼의 개념을 사용하고 있다.
정점 버퍼는, 통상은 정점을 저장 및 렌더링 할 때에 사용하는 VertexBuffer 오브젝트이다.
정점은, CustomVertex 커스텀 정점 클래스로 이용 가능한 구조체를 사용하여 여러가지 방법으로 정의 할 수 있다.
이 tutorial에서는 정점은 트랜스폼 되어 있으므로, 정점은 2D 윈도우 좌표로 표시되어 있다. 이를 테면 정점(0,0)은 좌 상단 이고,
양의 x 축은 우방향, 양의 y 축은 아래방향으로 되어 있다. 또 이들 정점은 Direct3D의 라이팅도 사용하지 않지만, 대신에 독자의
디퓨즈(difuse) 색을 제공한다. 이 같은 특징은, 다음의 코드에서 나타나듯이 CustomVertex.TransformedColored 구조체에서 정점
버퍼를 초기화 하는것으로 제공한다.
public class Vertices : Form
{
// Global variables for this project
Device device = null; // Rendering device
VertexBuffer vertexBuffer = null;
.
.
.
public void OnCreateDevice(object sender, EventArgs e)
{
Device dev = (Device)sender;
// Now create the vertex buffer
vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored),
3, dev, 0, CustomVertex.TransformedColored.Format,
Pool.Default);
vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(vertexBuffer, null);
}
public void OnCreateVertexBuffer(object sender, EventArgs e)
{
VertexBuffer vb = (VertexBuffer)sender;
GraphicsStream stm = vb.Lock(0, 0, 0);
CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
.
.
.
vb.Unlock();
}
}
위의 코드에서는, VertexBuffer.Lock 메소드를 호출하고, 정점 버퍼의 데이터에 CPU가 직접 액세스 할 수 있도록 하고 있다. Lock을 호출하는
경우는, 그럴 때마다 뒤에 UnLock를 호출하지 않으면 안된다. Lock와 UnLock에 대한 자세한 사항은 “3. 리소스의 Lock”를 참조 한다.
위의 코드에서 만들고 있는 verts 오브젝트는, 3개의 TransformedColored 구조체의 배열이며, 삼각형 3개의 정점마다 하나의 구조체를 사용한다.
각 정점 구조체의 (X,Y,Z) 필드, Rhw 필드, Color 필드는, 다음 코드에서 초기화 된다. 필요한 ARGB 32 비트형식으로 색 데이터를 제공 할 때에는
ToArgb 메소드를 사용한다.
verts[0].X=150;verts[0].Y=50;verts[0].Z=0.5f; verts[0].Rhw=1;
verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
verts[1].X=250;verts[1].Y=250;verts[1].Z=0.5f;verts[1].Rhw=1;
verts[1].Color = System.Drawing.Color.Brown.ToArgb();
verts[2].X=50;verts[2].Y=250;verts[2].Z=0.5f; verts[2].Rhw=1;
verts[2].Color = System.Drawing.Color.LightPink.ToArgb();
stm.Write(verts);
위의 2개의 코드에서는, GraphicsStream 클래스(stm오브젝트)를 사용했다.
쉐이더를 사용하는 입력 레지스터에 데이터를 바이드 할 때에는, 그래픽스 스트림을 사용한다. 이 코드에서는 GraphicsStream 오브젝트가 정점
버퍼에 직접 액세스 할 수 있도록 하고 있다. 바꿔 말하면, 정점 버퍼의 내용을 그래픽스 스트림에 두고, 스트림 내의 현재의 위치를 정점 버퍼의
길이 만큼 나아가고 있다.
다음 코드에서는, 스트림 소스, 정점 포맷, Device 오브젝트의 프리미티브 렌더링을 초기화 하도록, tutorial 1의 private 메소드 Render을
확장하는 방법을 나타낸다. Tutorial 1의 경우와 같게, 현재의 Vertices 오브젝트(frm)이 유효(有)한 동안 또는 시스템의 묘화(描) 이벤트가
트리거 되면, Render는 디스플레이에 렌더링을 한다.
private void Render()
{
if (device == null)
return;
// Clear the back buffer to a blue color (ARGB = 000000ff)
device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
// Begin the scene
device.BeginScene();
// New for Tutorial 2
device.SetStreamSource( 0, vertexBuffer, 0);
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
// End the scene
device.EndScene();
device.Present();
}