読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

DirectX11WindowsRuntimeゲームプログラミング入門vol.2:何もしないレンダラーを作る

Renderer

DirectXでは、画面に描画されるクラスはレンダラーと呼びます。

各レンダラーは

  1. コンストラクタ
  2. リソースの確保
  3. リソースの解放
  4. 更新
  5. 描画

の5つのメソッドを持ちます。

 

例えば車を描くレンダラーを例として考えると、

コンストラクタでは車の変数(燃料など)を初期化します。

リソースの確保では車を描画するために必要なリソース(テクスチャなど)をロードします。

そして、更新では入力を受け取り、車の状態を更新します。

例えば→キーの入力があれば車の座標を右にずらすなどの処理もUpdateで行います。

描画では車を実際に描画します。リソースの確保でロードしたテクスチャなどを使って、実際に画面に描画を行います。

リソースの解放では、リソースの確保でロードしたテクスチャなどのリソースを解放します。

こうすることでメモリには常にゲームに必要な最小のデータだけを確保します。

 

更新と描画は60fpsで高速に呼ばれます。こうすることで、1秒間に60フレームでゲームを更新し、リアルタイムなゲームを提供します。これをゲームループと呼びます。

32

 

 

何もしないレンダラーを作る

では実際にレンダラーを作っていきます。

ユニバーサルアプリの場合はSharedプロジェクトのContentフィルタ内に、それ以外は各プロジェクトのContentフィルタ内にTestRendererを作ります。

 

Contentを右クリック→追加→新しい項目を押します。

29

 

ヘッダーファイルを選択し、「TestRenderer.h」を追加します。

 

30

 

再びContentを右クリックし、追加→新しい項目を押します。

C++ファイルを選択し、「TestRenderer.cpp」を追加します。

31

 

 

 

TestRenderer.hの中身は以下のようにします。

#pragma once

#include "Common/DeviceResources.h"
#include "Common/StepTimer.h"

using namespace DX;
using namespace std;


class TestRenderer
{
public:
    TestRenderer(const shared_ptr<DeviceResources>& deviceResources);
    void CreateResources();
    void ReleaseResources();
    void Update(StepTimer const& timer);
    void Render();

protected:
    // デバイス リソース
    shared_ptr<DeviceResources> m_deviceResources;
};

TestRenderer.cppの中はこのようにします。

#include "pch.h"

#include "TestRenderer.h"

using namespace std;
using namespace DX;

//コンストラクタ
TestRenderer::TestRenderer(const shared_ptr<DeviceResources>& deviceResources)
    :m_deviceResources(deviceResources){

}

//リソース確保
void TestRenderer::CreateResources(){

}

//リソース解放
void TestRenderer::ReleaseResources(){

}

//更新
void TestRenderer::Update(StepTimer const&timer){

}

//描画
void TestRenderer::Render(){

}

 

これでレンダラーを作ることができました。

しかし、これだけではTestRendererはどこからも呼ばれないのでレンダラーとして機能しません。

[プロジェクト名]Mainから呼ぶ必要があります。

 

TestRendererを呼ぶ

[プロジェクト名]Main.hを開きます。

まずTestRenderer.hをインクルードします。

#include "TestRenderer.h"

 

29~30行目にある以下の記述を置き換えます。

//変更前
std::unique_ptr<Sample3DSceneRenderer> m_sceneRenderer;
std::unique_ptr<SampleFpsTextRenderer> m_fpsTextRenderer;

//変更後
std::unique_ptr<TestRenderer> m_testRenderer;

 

続いて、[プロジェクト名]Main.cppを開きます。

19~21行目にある以下の記述を置き換えます

//変更前
m_sceneRenderer = std::unique_ptr<Sample3DSceneRenderer>(new Sample3DSceneRenderer(m_deviceResources));

m_fpsTextRenderer = std::unique_ptr<SampleFpsTextRenderer>(new SampleFpsTextRenderer(m_deviceResources));

//変更後
m_testRenderer = std::unique_ptr<TestRenderer>(new TestRenderer(m_deviceResources));
m_testRenderer->CreateResources();

 

39行目あたりのCreateWindowSizeDependentResourcesメソッド内の以下の記述を置き換えます

//変更前
m_sceneRenderer->CreateWindowSizeDependentResources();

//変更後
m_testRenderer->CreateResources();

 

49~50行目あたりのUpdateメソッド内の以下の記述を置き換えます

//変更前
m_sceneRenderer->Update(m_timer);
m_fpsTextRenderer->Update(m_timer);

//変更後
m_testRenderer->Update(m_timer);

 

80~81行目あたりのRenderメソッド内の以下の記述を置き換えます

//変更前
m_sceneRenderer->Render();
m_fpsTextRenderer->Render();

//変更後
m_testRenderer->Render();

 

89~90行目のOnDeviceLostメソッドないの以下の記述を置き換えます

//変更前
m_sceneRenderer->ReleaseDeviceDependentResources();
m_fpsTextRenderer->ReleaseDeviceDependentResources();

//変更後
m_testRenderer->ReleaseResources();

 

96~97行目のOnDeviceLostメソッド内の以下の記述を置き換えます。

//変更前
m_sceneRenderer->CreateDeviceDependentResources();
m_fpsTextRenderer->CreateDeviceDependentResources();

//変更後
m_testRenderer->CreateResources();

 

ここまでできたらデバッグしてみましょう。

青い画面だけで、ほかに何も描画されていなければ成功です。

33

 

今回のサンプルコードはこちらです

SampleGameDx_1_EmptyRenderer.zip

何もしないレンダラーを作る | garicchi.com

DirectX11WindowsRuntimeゲームプログラミング入門 | garicchi.com