내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8용 Direct3D with XAML 앱

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1만

 

이 항목에서는 Direct3D with XAML 앱의 구조에 대해 설명하고 Windows Phone SDK 8.0 에 포함된 프로젝트 템플릿을 순차적으로 보여 줍니다. 이 앱 유형은 Direct3D를 통해 UI에서 XAML 컨트롤 뒤에 있는 전체 앱 배경에 걸쳐 표시되는 그래픽을 렌더링할 수 있는 DrawingSurfaceBackgroundGrid 컨트롤을 사용합니다. DrawingSurfaceBackgroundGrid는 XAML 트리의 루트여야 하며 항상 전체 화면 크기입니다.

다른 앱 유형은 DrawingSurface 컨트롤을 사용하는 XAML 및 Direct3D 앱입니다. 해당 컨트롤은 임의 크기로 다른 XAML 컨트롤의 위, 아래 및 인라인으로 배치될 수 있습니다. 앱에 알맞은 컨트롤 선택에 대한 자세한 내용은 Windows Phone 8의 게임에 적합한 프로젝트 템플릿 선택을 참조하세요.

Windows 스토어 앱에 대한 게임 개발을 설명하기 위해 만든 Marble Maze 샘플은 Direct3D with XAML 프로젝트 템플릿을 사용하도록 포팅되었습니다. 샘플을 다운로드하려면 Direct3D with XAML Marble Maze를 참조하세요.

Direct3D with XAML 앱은 XAML 기반 Windows Phone 앱과 Windows Phone Runtime 를 기반으로 한 구성 요소, 이렇게 두 개의 구성 요소로 이루어져 있습니다. XAML 엔진은 Direct3D 그래픽 장치를 만들고 유지 관리합니다. 프레임당 한 번씩 XAML 엔진은 그래픽 장치 및 연결된 렌더링 대상을 Windows Phone Runtime 구성 요소에 전달합니다. 그래픽 장치가 업데이트된 후 Windows Phone Runtime 구성 요소의 Render 메서드가 호출됩니다. 이 경우 앱에서 Direct3D를 호출하여 제공된 렌더링 대상에 그릴 수 있습니다. 그래픽 장치는 XAML 엔진과 공유되므로 Render 메서드는 앱이 그리기에 장치를 사용할 수 있는 유일한 위치입니다. Windows Phone SDK 8.0 에서는 이 앱 유형에 필요한 하위 수준 인프라를 구현하는 프로젝트 템플릿을 제공합니다. 이 프로젝트 템플릿을 사용하여 새 앱을 만든 다음 F5를 누르면 즉시 장치나 Windows Phone 에뮬레이터 의 화면에 렌더링된 3D 큐브를 볼 수 있습니다. 이 항목의 나머지 부분에서는 Direct3D with XAML 앱을 위한 프로젝트 템플릿에 대해 전체적으로 살펴봅니다.

앱에서 XAML 프로젝트 템플릿과 함께 및 Direct3D를 사용하고 이 앱에 하나 이상의 페이지가 있는 경우 프로젝트 템플릿에 포함된 파일을 다음과 같이 변경해야 합니다. 이렇게 해야 사용자가 페이지 간을 이동할 때 메모리가 올바로 관리됩니다. 이 변경 사항들은 향후 출시되는 프로젝트 템플릿에 포함됩니다.

프로젝트 템플릿을 업데이트하려면

  1. MainPage.xaml.cs에서 라인

    
    private Direct3DBackground m_d3dBackground = new Direct3DBackground();
    
    
    

    을 다음과 같이 바꿉니다.

    
    private Direct3DBackground m_d3dBackground = null;
    
    
    
  2. MainPage.xaml.cs에서, DrawingSurface 컨트롤에 대한 Loaded 이벤트 처리기를 다음과 같이 바꿉니다.

    
    private void DrawingSurfaceBackground_Loaded(object sender, RoutedEventArgs e)
    {
        if (m_d3dBackground == null)
        {
            m_d3dBackground = new Direct3DBackground();
    
            // Set window bounds in dips
            m_d3dBackground.WindowBounds = new Windows.Foundation.Size(
                (float)Application.Current.Host.Content.ActualWidth,
                (float)Application.Current.Host.Content.ActualHeight
                );
    
            // Set native resolution in pixels
            m_d3dBackground.NativeResolution = new Windows.Foundation.Size(
                (float)Math.Floor(Application.Current.Host.Content.ActualWidth * Application.Current.Host.Content.ScaleFactor / 100.0f + 0.5f),
                (float)Math.Floor(Application.Current.Host.Content.ActualHeight * Application.Current.Host.Content.ScaleFactor / 100.0f + 0.5f)
                );
    
            // Set render resolution to the full native resolution
            m_d3dBackground.RenderResolution = m_d3dBackground.NativeResolution;
    
            // Hook-up native component to DrawingSurfaceBackgroundGrid
            DrawingSurfaceBackground.SetBackgroundContentProvider(m_d3dBackground.CreateContentProvider());
            DrawingSurfaceBackground.SetBackgroundManipulationHandler(m_d3dBackground);
        }
    }
    
    
    
  3. PhoneDirect3DXamlAppComponent.cpp에서, CreateContentProvider 메서드의 정의를 다음과 같이 바꿉니다.

    
    IDrawingSurfaceBackgroundContentProvider^ Direct3DBackground::CreateContentProvider()
    {
    	ComPtr<Direct3DContentProvider> provider = Make<Direct3DContentProvider>(this);
    	return reinterpret_cast<IDrawingSurfaceBackgroundContentProvider^>(provider.Get());
    }
    
    
    

이 섹션에서는 Direct3D with XAML 앱 프로젝트 템플릿에 포함된 파일에 대해 전체적으로 살펴봅니다.

Direct3D with XAML 앱을 작성할 예정이라면 Windows Phone SDK 8.0 과 함께 제공하는 Direct3D with XAML 앱 프로젝트 템플릿으로 시작해야 합니다. 새 프로젝트를 만들려면 Visual Studio 의 파일 메뉴에서 새 프로젝트를 클릭한 다음 Visual C# 아래에서 Windows Phone Direct3D with XAML 앱을 클릭합니다.

이 템플릿에서는 관리되는 XAML 기반 앱과 Windows Phone Runtime 구성 요소, 이렇게 두 개의 프로젝트가 있는 새로운 솔루션을 만듭니다. XAML 앱은 일반적인 Windows Phone 앱과 거의 동일합니다. 이 앱에서는 XAML과 관리 코드를 사용하여 Direct3D 그래픽을 사용하지 않는 앱에서 하는 것과 동일한 방식으로 UI를 구현할 수 있습니다. 유일한 차이점은 Direct3D 그래픽이 표시될 DrawingSurfaceBackgroundGrid 컨트롤을 추가하는 몇 줄의 추가 코드가 프로젝트에 추가되어 Windows Phone Runtime 구성 요소에 대한 연결을 설정한다는 것입니다.

Windows Phone Runtime 구성 요소 프로젝트에는 Windows Phone 의 순수 네이티브 Direct3D 앱의 파일들과 유사하고 Windows 8 의 Direct3D 프로젝트 템플릿과 유사한 파일이 일부 포함되어 있습니다. 이 파일들은 그래픽 장치 포함을 자동으로 처리하며 화면에 큐브를 그리는 몇 가지 예제 코드를 포함하고 있습니다. Direct3D 그래픽을 XAML UI에 통합하는 내부 XAML 엔진은 물론, Windows Phone Runtime 구성 요소와 기본 응용프로그램 간에 통신하는 데 사용되는 파일도 있습니다. 빨리 앱 작성을 시작하고 싶고, 이러한 앱이 작동할 수 있도록 해주는 낮은 수준의 기술적 세부 정보에는 관심이 없는 경우에는 XAML 기반 UI와 관리 코드를 호스트하는 MainPage 클래스와, 공유 질감에 실제로 그리는 작업을 수행하는 CubeRenderer 클래스와, 터치 입력에 대해 설명하는 PhoneDirect3DXamlAppComponent.cpp 파일의 해당 섹션만 읽어도 됩니다. 이 항목의 나머지 부분은 템플릿에서 제공하는 코드에 대해 자세히 설명하기 위한 것입니다.

관리되는 XAML 앱

앞서 언급했듯이, Direct3D with XAML 템플릿의 일부로서 만들어진 XAML 앱 프로젝트는 Direct3D를 전혀 사용하지 않는 일반적인 Windows Phone 앱과 거의 동일합니다. 하지만, 파일들 중 두 개에 약간의 추가 코드가 있습니다.

MainPage.xaml

이 파일은 XAML 기반 Windows Phone 앱이 자체 UI를 정의하는 곳입니다. 이 프로젝트 템플릿을 사용하면 DrawingSurfaceBackgroundGrid 컨트롤이 자동으로 추가됩니다. 이 컨트롤은 XAML 페이지의 루트 요소입니다. 다른 XAML 컨트롤을 DrawingSurfaceBackgroundGrid의 자식으로 추가할 수 있지만 DrawingSurfaceBackgroundGrid 앞, 뒤 또는 내부에 요소를 배치할 수는 없습니다.


<DrawingSurfaceBackgroundGrid x:Name="DrawingSurfaceBackground" Loaded="DrawingSurfaceBackground_Loaded">
</DrawingSurfaceBackgroundGrid>


MainPage.xaml.cs

기본 페이지의 코드 숨김 파일은 DrawingSurfaceBackgroundGrid 컨트롤이 실제 Direct3D 그리기를 수행하는 Windows Phone Runtime 구성 요소에 후크되는 곳입니다. 페이지 상단의 using 지시문은 Windows Phone Runtime 구성 요소 “PhoneDirect3DXamlAppComponent”가 들어 있는 네임스페이스를 참조합니다.


using PhoneDirect3DXamlAppComponent;


다음으로, 형식 Direct3DBackground의 멤버 변수가 선언됩니다. Direct3DBackground는 Windows Phone Runtime 구성 요소에 의해 노출되는 클래스입니다. 이 클래스는 이 연습의 훨씬 뒷부분에서 다뤄집니다.


private Direct3DBackground m_d3dBackground = null;


템플릿이 MainPage.xaml.cs에서 만드는 메서드는 DrawingSurfaceBackgroundGrid 컨트롤에 대한 Loaded 이벤트 처리기뿐입니다. 이 메서드의 첫 부분은 Direct3DBackground 클래스의 WindowBounds, NativeResolutionRenderResolution 속성을 설정합니다. 이러한 속성을 통해 Windows Phone Runtime 구성 요소가 화면과 크기가 같은 뷰포트를 만들 수 있습니다. WindowBounds 속성은 DrawingSurfaceBackgroundGrid 및 모든 컨트롤이 ActualWidthActualHeight 속성에 사용하는 것과 동일한 단위인 dips(장치 독립적 픽셀)로 노출되는 크기를 사용합니다. NativeResolutionRenderResolution 속성에는 실제 픽셀로 표현되는 크기가 필요하므로 100으로 나눈 ScaleFactor 속성을 곱하여 크기를 변환합니다. 그러면 크기(픽셀 단위)가 지원되는 모든 화면 해상도에 맞게 됩니다. 0.5픽셀을 수식에 추가하면 Floor 함수 호출에서 가장 가까운 정수로 크기를 반올림합니다.

크기 속성을 설정한 후 DrawingSurfaceBackgroundGrid 컨트롤의 SetContentProvider(Object) 메서드가 Direct3DBackground 메서드 CreateContentProvider에서 반환된 개체와 함께 호출됩니다. 이 호출은 Windows Phone Runtime 구성 요소를, Direct3D를 사용하여 DrawingSurfaceBackgroundGrid 컨트롤의 콘텐츠를 그리게 되는 공급자로 설정합니다. 이 연습의 뒷부분에서 다루게 되겠지만 프로젝트 템플릿은 CreateContentProvider 도우미 메서드를 사용하여 콘텐츠 공급자를 설정하기 위한 낮은 수준의 호출을 캡슐화하는 데 도움이 되도록 구성되어 있습니다.

다음으로 SetManipulationHandler(Object)가 호출되고 Direct3DBackground 개체가 전달됩니다. 이렇게 되면 Direct3DBackground가 등록되어, DrawingSurfaceBackgroundGrid 컨트롤 내부를 사용자가 터치했을 때 PointerPressed(), PointerMoved()PointerReleased() 터치 이벤트가 수신됩니다. MainPage 코드 숨김 페이지에서 터치 이벤트를 가져온 다음 수동으로 해당 데이터를 Windows Phone Runtime 구성 요소에 전달하는 것보다 이 구성 요소에서 바로 이러한 이벤트를 사용하는 것이 성능이 더 좋습니다.


private void DrawingSurfaceBackground_Loaded(object sender, RoutedEventArgs e)
{
    if (m_d3dBackground == null)
    {
        m_d3dBackground = new Direct3DBackground();

        // Set window bounds in dips
        m_d3dBackground.WindowBounds = new Windows.Foundation.Size(
            (float)Application.Current.Host.Content.ActualWidth,
            (float)Application.Current.Host.Content.ActualHeight
            );

        // Set native resolution in pixels
        m_d3dBackground.NativeResolution = new Windows.Foundation.Size(
            (float)Math.Floor(Application.Current.Host.Content.ActualWidth * Application.Current.Host.Content.ScaleFactor / 100.0f + 0.5f),
            (float)Math.Floor(Application.Current.Host.Content.ActualHeight * Application.Current.Host.Content.ScaleFactor / 100.0f + 0.5f)
            );

        // Set render resolution to the full native resolution
        m_d3dBackground.RenderResolution = m_d3dBackground.NativeResolution;

        // Hook-up native component to DrawingSurfaceBackgroundGrid
        DrawingSurfaceBackground.SetBackgroundContentProvider(m_d3dBackground.CreateContentProvider());
        DrawingSurfaceBackground.SetBackgroundManipulationHandler(m_d3dBackground);
    }
}


Windows 런타임 구성 요소

이 섹션에서는 Direct3D with XAML 앱 프로젝트 템플릿의 일부로서 만들어진 Windows 런타임 구성 요소에 대해 설명합니다. 이 프로젝트에 있는 파일들 중 많은 수가 이 구성 요소로 DrawingSurfaceBackgroundGrid 컨트롤을 후크하는 것에 대한 낮은 수준의 세부 사항을 처리합니다. 대부분의 시나리오에서는 이것을 수정할 필요가 없을 것입니다.

PhoneDirect3DXamlAppComponent.h

이 헤더 파일은 Direct3DBackground 클래스를 선언합니다. 이 클래스는 XAML 엔진과 Direct3D 코드 간 프록시로 작동합니다. 이 클래스는 PointerPressed(), PointerMoved()PointerReleased() 이벤트를 포함하는 IDrawingSurfaceManipulationHandler 인터페이스를 구현합니다.

PhoneDirect3DXamlAppComponent.cpp

PhoneDirect3DXamlAppComponent 구현 파일에서는 MainPage.xaml.cs의 DrawingSurfaceBackground_Loaded 이벤트 처리기에서 호출되는 CreateContentProvider 메서드의 정의가 표시됩니다. 이 메서드는 Direct3DContentProvider 클래스의 새 인스턴스를 초기화하고 이것을 IDrawingSurfaceContentProvider로서 캐스팅합니다. IDrawingSurfaceContentProvider의 정의를 보면 정의된 멤버가 없다는 것을 알게 될 것입니다. 이것은 코드를 사용하여 구현하는 인터페이스가 아니기 때문입니다. Direct3DContentProvider 클래스는 WRL(Windows Runtime C++ Template Library)을 사용하여 구현됩니다. 이 메서드는 XAML 엔진이 액세스할 수 있도록 이 클래스를 Windows Phone Runtime 인터페이스로 캐스팅합니다. 앱 개발 시 이러한 구현 세부 정보에 대해 걱정할 필요는 없습니다. 여기에서는 정보용으로만 설명하고 있습니다.


IDrawingSurfaceBackgroundContentProvider^ Direct3DBackground::CreateContentProvider()
{
	ComPtr<Direct3DContentProvider> provider = Make<Direct3DContentProvider>(this);
	return reinterpret_cast<IDrawingSurfaceBackgroundContentProvider^>(provider.Get());
}


다음으로 PhoneDirect3DXamlAppComponent.cpp는 MainPage.xaml.cs의 DrawingSurfaceBackground_Loaded 이벤트 처리기에서 호출되는 SetManipulationHost(DrawingSurfaceManipulationHost) 메서드 구현을 제공하므로 Direct3DBackground 클래스가 DrawingSurface 컨트롤에서 터치 입력 이벤트를 수신할 수 있습니다. 이 템플릿에서는 자신만의 코드를 추가할 수 있는 터치 입력 이벤트용 스텁 아웃된 처리기도 제공합니다.


void Direct3DBackground::SetManipulationHost(DrawingSurfaceManipulationHost^ manipulationHost)
{
	manipulationHost->PointerPressed +=
		ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DBackground::OnPointerPressed);

	manipulationHost->PointerMoved +=
		ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DBackground::OnPointerMoved);

	manipulationHost->PointerReleased +=
		ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DBackground::OnPointerReleased);
}



void Direct3DBackground::OnPointerPressed(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
{
	// Insert your code here.
}

void Direct3DBackground::OnPointerMoved(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
{
	// Insert your code here.
}

void Direct3DBackground::OnPointerReleased(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
{
	// Insert your code here.
}


다음으로 PhoneDirect3DXamlAppComponent.cpp는 ConnectDisconnect 메서드를 정의합니다. ConnectSetContentProvider(Object) 호출이 완료된 후 호출됩니다. 이 메서드에서 새 CubeRenderer가 만들어지고 Initialize 메서드가 호출됩니다. 이 호출 동안 CubeRenderer는 꼭짓점 버퍼 및 셰이더같은 장치별 리소스를 만듭니다. Disconnect은 연결된 DrawingSurfaceBackgroundGrid 컨트롤이 시각적 트리를 벗어나면 호출됩니다.


HRESULT Direct3DBackground::Connect(_In_ IDrawingSurfaceRuntimeHostNative* host, _In_ ID3D11Device1* device)
{
	m_renderer = ref new CubeRenderer();
	m_renderer->Initialize(device);
	m_renderer->UpdateForWindowSizeChange(WindowBounds.Width, WindowBounds.Height);

	// Restart timer after renderer has finished initializing.
	m_timer->Reset();

	return S_OK;
}

void Direct3DBackground::Disconnect()
{
	m_renderer = nullptr;
}


PrepareResources 메서드는 XAML 엔진을 통해 각 프레임에 대해 호출됩니다. 이때 Windows Phone Runtime 구성 요소가 렌더링 대상의 요청된 크기를 설정할 수 있습니다. 이 템플릿은 렌더링 대상의 너비와 높이를 DrawingSurfaceBackground_Loaded에서 XAML 앱에 의해 설정된 화면 크기로 설정합니다. 렌더링 속도를 높이기 위해 이 크기를 더 작게 설정할 수 있습니다(예: 실제 화면 해상도의 1/4). XAML 엔진은 하드웨어 배율 조정을 자동으로 사용하여 더 작은 렌더링 대상의 배율을 전체 화면 크기로 효율적으로 조정합니다.

주의주의:

XAML 엔진은 하드웨어 배율 조정을 사용하여 Direct3D with XAML 랩에 대한 렌더링 대상의 배율을 조정합니다. MediaElement에서도 하드웨어 배율 조정을 사용하므로 XAML 시각적 트리에 MediaElement가 있고 없음이 DrawingSurfaceBackgroundGrid 성능에 중요합니다. DrawingSurfaceBackgroundGridMediaElement 없이 사용하면 런타임에 추가 최적화가 이루어져 성능이 향상될 수 있습니다.


HRESULT Direct3DBackground::PrepareResources(_In_ const LARGE_INTEGER* presentTargetTime, _Inout_ DrawingSurfaceSizeF* desiredRenderTargetSize)
{
	m_timer->Update();
	m_renderer->Update(m_timer->Total, m_timer->Delta);

	desiredRenderTargetSize->width = RenderResolution.Width;
	desiredRenderTargetSize->height = RenderResolution.Height;

	return S_OK;
}


PhoneDirect3DXamlAppComponent.cpp에 정의된 마지막 메서드는 Draw입니다. 이 메서드에서 수행되는 첫 번째 작업은 Direct3Dbase.cpp에 정의된 UpdateDevice가 호출되어 그래픽 장치, 컨텍스트 및 렌더링 대상을 업데이트하는 것입니다. 사용자가 앱을 벗어났다가 돌아오면 XAML 엔진이 그래픽 장치를 상실하고 다시 만들게 됩니다. 이렇게 되면 이 메서드를 통해 질감, 셰이더 등의 장치 종속 리소스를 다시 만들 수 있습니다.

XAML 엔진은 XAML UI를 업데이트할 때마다 Draw 메서드를 한 번 호출합니다. RequestAdditionalFrame을 호출하면 현재 프레임이 완료된 후 가능한 즉시 화면을 다시 그리도록 XAML 엔진에 요청됩니다. RequestAdditionalFrame에 대한 호출은 Connect가 호출된 후, Disconnect가 호출되기 전에 Windows Phone Runtime 구성 요소의 어디에서든 만들 수 있습니다. 앱의 전원 소비를 줄이기 위해 Draw 메서드가 호출될 때마다 RequestAdditionalFrame이 호출되지 않도록 템플릿 코드를 수정할 수 있습니다. XAML 엔진은 UI를 업데이트할 때마다 Draw를 호출하지만 가능한 즉시 다시 그리려고 시도하지 않습니다. 이는 특히 앱이 정적 콘텐츠나, 가능한 가장 높은 프레임 속도로 다시 그릴 필요가 없는 콘텐츠를 표시하는 경우 유용합니다.


HRESULT Direct3DBackground::Draw(_In_ ID3D11Device1* device, _In_ ID3D11DeviceContext1* context, _In_ ID3D11RenderTargetView* renderTargetView)
{
	m_renderer->UpdateDevice(device, context, renderTargetView);
	m_renderer->Render();

	RequestAdditionalFrame();

	return S_OK;
}


Direct3DBase.cpp

Direct3DBase는 Windows 8 용은 물론 Windows Phone 용 Direct3D 앱 의 프로젝트 템플릿을 비롯한 많은 Direct3D 프로젝트 템플릿에서 볼 수 있는 클래스입니다. 이 클래스의 구현은 XAML 및 Direct3D 앱 템플릿의 경우와 약간 다르지만 기능 구조는 유사합니다. 대부분의 시나리오에서 이 클래스를 수정할 필요가 없습니다. 이 클래스는 즉시 CreateDeviceResources를 호출하는 Initialize 메서드를 노출합니다. 이 메서드의 기본 구현은 아무 것도 하지 않습니다. CubeRenderer.cpp의 오버로드된 메서드는 이 메서드를 사용하여 질감, 셰이더 등의 장치 종속 리소스를 만듭니다. 앱이 실행되는 동안 그래픽 장치가 변경되는 경우 이 메서드를 여러 번 호출할 수 있습니다.

다음으로 Direct3DBaseUpdateDevice 메서드를 구현합니다. 앞에서 이 메서드가 Direct3DBackground 클래스에서 프레임당 한 번 호출됨을 확인했습니다. 이전 프레임 이후 그래픽 장치가 변경된 경우 CreateDeviceResources가 다시 호출됩니다. 렌더링 대상 크기가 변경된 경우 CreateWindowSizeDependentResources가 호출됩니다. 마지막으로 뷰포트 개체는 렌더링 대상 크기를 기준으로 만들어집니다.

CubeRenderer.cpp

CubeRenderer 클래스는 Direct3Dbase에서 상속됩니다. 여기에서는 회전 큐브를 그리는 예제 Direct3D 코드가 제공됩니다. 다시, 이 파일은 다양한 플랫폼에서 Direct3D 템플릿에 공통적으로 사용됩니다. 이제 막 Direct3D를 시작하는 경우, 이 파일의 코드를 수정하여 화면에 그려지는 내용을 변경하는 데에만 시간을 쓸 수 있습니다. 결국, 이 클래스는 게임을 위해 특별히 만든 클래스로 교체될 가능성이 높지만 이 때에도 동일한 기본 구조를 유지해야 합니다. 예를 들어, 여러분의 클래스는 Direct3DBase에서 상속되어야 합니다.

CubeRenderer.cpp에는 CreateDeviceResources의 메서드 정의가 들어 있습니다. 여기에서 장치에 종속된 리소스를 만듭니다. 이 템플릿의 예제 코드는 큐브가 렌더링 대상에 그려지는 방식을 정의하는 꼭짓점 셰이더와 픽셀 셰이더 이외에도 큐브의 기하 도형을 정의하는 꼭짓점 버퍼와 인덱스 버퍼를 만듭니다.

다음으로, 메서드 CreateWindowSizeDependentResources가 정의됩니다. 이 메서드는 렌더링 대상의 크기를 사용하여 원근 매트릭스를 만듭니다.

마지막으로, CubeRenderer.cpp는 각 프레임에 대해 한 번씩 호출되는 UpdateRender 메서드를 구현합니다. Update는 보통 게임에 있는 개체들이 각 프레임에 대해 새 위치로 업데이트되는 곳입니다. 예제 코드에서는 보기 및 모델 매트릭스를 업데이트하여 큐브가 화면에서 회전하게 합니다. Render는 Direct3D 호출을 하여 렌더링 대상에 그리는 곳입니다. 이 메서드에 삽입하는 코드는 게임에 따라 크게 달라집니다. 그래픽 장치는 XAML 엔진에 소유되므로 그래픽 장치를 사용하여 Render 메서드가 실행되는 동안 렌더링 대상에만 그릴 수 있습니다.

Direct3DContentProvider.cpp

Direct3DContentProvider.cpp는 Windows Phone Runtime 구성 요소로 XAML 엔진을 후크하는 것에 대한 낮은 수준의 세부 사항을 처리합니다. 이 동작은 대부분의 경우 게임을 구현하기 위해 수정할 필요가 없으므로 이 클래스에서 캡슐화되었습니다.

Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2015 Microsoft