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

がりらぼ

WindowsRuntimeの応援ブログ

DirectX11WindowsRuntimeゲームプログラミング入門vol.3:2D画像を描画する

DirectX C++

前回までに作成したプロジェクトに、DirectXToolkitを使って2D画像を描画していきます。

 

2Dテクスチャ

DirectXでは2Dテクスチャ自体はID3D11ShaderResourceView型で扱われます。

この2Dテクスチャに画像ファイルを読み込むのですが、普通にやったら大変なので、DirectXToolkitのWicTexureLoaderを使います。

 

SpriteBatch

また、2Dテクスチャを描画するためにはSpriteBatchというものを使って描画を行います。

SpriteBatchとはDirectXToolkitに用意された、2Dテクスチャを簡単に描画するための様々な機能をもったクラスです。

 

描画するテクスチャを追加する

まず、描画するテクスチャを容易しましょう。

ソリューションエクスプローラーからプロジェクトを右クリック→追加→既存の項目で

pngファイルなどを追加しましょう。

34

ただしこの方法で追加したファイルはファイルへのリンクが追加されるだけなので、ファイルをコピーしたい場合はエクスプローラーでファイルをプロジェクトのディレクトリに移動させてソリューションエクスプローラーのすべてのファイルを表示でファイルを表示させ、「右クリックでプロジェクトに含める」でプロジェクトに含めましょう。

35

 

2Dテクスチャを描画する

TestRenderer.hで以下のヘッダファイルをインクルードしましょう。

#include "SpriteBatch.h"
#include "WICTextureLoader.h"

また、名前空間の宣言もしておきます。

DirectXはDirectXTollkitの名前空間で、Microsoft::WRLは後でつけるComPtrスマートポインターを使うためのものです。

using namespace DirectX;
using namespace Microsoft::WRL;

 

TestRenderer.h内でメンバに以下を追加します。

//2Dスプライト
shared_ptr<SpriteBatch> m_sprites;
//2Dテクスチャ
ComPtr<ID3D11ShaderResourceView> m_texture1;

ComPtrとはC++/CXで用意されるクラスのスマートポインターです。

スマートポインターとはさしている先の参照カウントを記憶しておいて、参照カウントが0になると自動で実体を破棄してくれるポインターです。つまりスマートポインターをつかったポインターは実体が必要なくなっても明示的にdeleteをする必要がありません。

 

TestRenderer.cppのCreateResourcesメソッド内に2Dスプライトの初期化処理とテクスチャの読み込み処理を追加します。

auto device = m_deviceResources->GetD3DDevice();
auto context = m_deviceResources->GetD3DDeviceContext();

m_sprites=shared_ptr<SpriteBatch>(new SpriteBatch(context));

CreateWICTextureFromFile(device, L"assets/icon.png", nullptr, m_texture1.ReleaseAndGetAddressOf());

CreateWicTexureFromFileはWICTexureLoader.hで定義されているクラスで、

第二引数で画像ファイルのパス、第4引数でテクスチャインスタンスのアドレスを渡すことで画像ファイルをロードしてくれます。

 

TestRenderer.cppのRenderメソッド内で描画処理を記述します。

m_sprites->Begin();

m_sprites->Draw(m_texture1.Get(), XMFLOAT2(10, 75), nullptr, Colors::White);

m_sprites->End();

ReleaseDeviceDependentResourcesメソッドでメモリ解放を行います。

m_sprites.reset();
m_texture1.Reset();

 

2Dテクスチャを描画できました。

36

今回のコードはこんな感じ

TestRenderer.h

#pragma once

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

#include "SpriteBatch.h"
#include "WICTextureLoader.h"

using namespace DX;
using namespace std;

using namespace DirectX;
using namespace Microsoft::WRL;

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;
    //2Dスプライト
    shared_ptr<SpriteBatch> m_sprites;
    //2Dテクスチャ
    ComPtr<ID3D11ShaderResourceView> m_texture1;
};

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(){
    auto device = m_deviceResources->GetD3DDevice();
    auto context = m_deviceResources->GetD3DDeviceContext();

    m_sprites=shared_ptr<SpriteBatch>(new SpriteBatch(context));

    CreateWICTextureFromFile(device, L"assets/icon.png", nullptr, m_texture1.ReleaseAndGetAddressOf());
}

//リソース解放
void TestRenderer::ReleaseResources(){
    m_sprites.reset();

    
    m_texture1.Reset();
    
}

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

}

//描画
void TestRenderer::Render(){
    m_sprites->Begin();

    m_sprites->Draw(m_texture1.Get(), XMFLOAT2(10, 75), nullptr, Colors::White);

    m_sprites->End();
}

SampleGameDx_2_2DTexture.zip

2D画像を描画する | garicchi.com