以下ソースコード
#include "DxLib.h"
#include <Live2D.h>
#include <Live2DModelD3D11.h>
#include <D3D11.h>
#include <vector>
#include <DirectXMath.h>
#include "WICTextureLoader.h"
#include <util/UtSystem.h>
using namespace std;
using namespace live2d;
#define SCREEN_X 800
#define SCREEN_Y 600
#pragma comment(lib,"d3d11.lib")
Live2DModelD3D11 *live2DModel;
ID3D11Device *DXDev;
ID3D11DeviceContext *DXDevCon;
IDXGISwapChain *_swapChain;
ID3D11RenderTargetView *_backBufferRTV;
vector<ID3D11ShaderResourceView*> _textures;
HRESULT InitModel()
{
//SetUseDirect3D9Ex();
// モデルのロード
const char* mocPath = "haru\\runtime\\haru.moc";
const wchar_t *texturePaths[] = {
L"haru\\runtime\\haru.1024\\texture_00.png",
L"haru\\runtime\\haru.1024\\texture_01.png",
L"haru\\runtime\\haru.1024\\texture_02.png",
};
const int numTexturePath = sizeof(texturePaths) / sizeof(LPCTSTR);
live2DModel->loadModel(mocPath);
// テクスチャのロード
ID3D11ShaderResourceView* textureSRV;
for (int i = 0; i < numTexturePath; i++)
{
if (SUCCEEDED(DirectX::CreateWICTextureFromFileEx(DXDev, DXDevCon, texturePaths[i], 0,
D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, NULL, &textureSRV)))
{
_textures.push_back(textureSRV);
live2DModel->setTexture(i, textureSRV);
}
else
{
live2d::UtDebug::error("Could not create texture [%d]", i);
return E_FAIL;
}
}
// 座標変換
// 現在のLive2Dモデルは、画像のように下向きに(0,0,w,h)に配置される
// センタリングと上下逆転が必要
{
float aspect = static_cast<float>(SCREEN_Y) / SCREEN_X;
float modelWidth = live2DModel->getModelImpl()->getCanvasWidth();
float modelHeight = live2DModel->getModelImpl()->getCanvasHeight();
DirectX::XMMATRIX ortho = DirectX::XMMatrixOrthographicLH(modelHeight, -modelHeight * aspect, -1.0f, 1.0f);
DirectX::XMMATRIX trans = DirectX::XMMatrixTranslation(-modelWidth / 2, -modelHeight / 2, 0);
DirectX::XMFLOAT4X4 wvp;
DirectX::XMStoreFloat4x4(&wvp, DirectX::XMMatrixMultiplyTranspose(trans, ortho));
live2DModel->setMatrix(reinterpret_cast<float*>(wvp.m));
}
return S_OK;
}
void Render(int Screen, int PMAScreen, int SoftImage)
{
SetDrawScreen(Screen);
if (ClearDrawScreen() != 0)
exit(1);
DrawString(SCREEN_X / 2, SCREEN_Y / 2, "A", GetColor(255, 255, 255));
RenderVertex();
// モデルのパラメータを直接設定するサンプル
double t = (UtSystem::getUserTimeMSec() / 1000.0) * 2 * 3.14;
// 首ふり
live2DModel->setParamFloat("PARAM_ANGLE_X", (float)(30 * sin(t / 3.0)));
// 目パチ
live2DModel->setParamFloat("PARAM_EYE_L_OPEN", (float)(1.0 + sin(t / 3)));
live2DModel->setParamFloat("PARAM_EYE_R_OPEN", (float)(1.0 + sin(t / 3)));
// モデルの描画
live2DModel->update();
live2DModel->draw();
RefreshDxLibDirect3DSetting();
// 描画した内容を乗算済みアルファに変換
GraphFilterBlt(Screen, PMAScreen, DX_GRAPH_FILTER_PREMUL_ALPHA);
// 描画した内容を乗算済みアルファに変換した画像を描画対象にする
SetDrawScreen(PMAScreen);
// 乗算済みアルファに変換した画像の取り込み
GetDrawScreenSoftImage(0, 0, SCREEN_X, SCREEN_Y, SoftImage);
// 取り込んだ乗算済みアルファの画像で透過ウインドウを更新
UpdateLayerdWindowForPremultipliedAlphaSoftImage(SoftImage);
// 少し( 13ミリ秒 )待つ
// ( ScreenFlip と異なり自動的にウエイト処理をしてくれないので )
WaitTimer(13);
}
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int Screen;
int PMAScreen;
int SoftImage;
// タイトルを test に変更
SetMainWindowText("Test");
// ウインドウモードに変更
ChangeWindowMode(TRUE);
//描画先を裏画面に変更
SetDrawScreen(DX_SCREEN_BACK);
// Direct3D9Ex ではなく Direct3D9 を使う
//SetUseDirect3D9Ex(FALSE);
// 画面解像度の設定
SetGraphMode(800, 600, 32);
// 透過ウインドウを使用する指定を行う
SetUseUpdateLayerdWindowFlag(TRUE);
ChangeWindowMode(TRUE);
SetUseDirect3D11(TRUE);
if (DxLib_Init() == -1)
return -1;
//描画対象にできるアルファチャンネル付き画面を作成
Screen = MakeScreen(SCREEN_X, SCREEN_Y, TRUE);
//乗算済みアルファの画像を格納する為のアルファチャンネル付き画面を作成
PMAScreen = MakeScreen(SCREEN_X, SCREEN_Y, TRUE);
//画面取り込み用のソフトウエア用画像を作成
SoftImage = MakeARGB8ColorSoftImage(SCREEN_X, SCREEN_Y);
DXDev = (ID3D11Device*)GetUseDirect3D11Device();
DXDevCon = (ID3D11DeviceContext*)GetUseDirect3D11DeviceContext();
Live2D::init();
Live2DModelD3D11::setGraphicsContext(DXDev, DXDevCon);
while (ProcessMessage() == 0)
{
Render(Screen, PMAScreen, SoftImage);
}
DxLib_End();
return 0;
}
以下Log.txt
0:ChangeWindowMode実行
2:ウインドウモードフラグが立てられました
8:ChangeWindowMode実行
14:DXライブラリの初期化処理開始
20: システムの情報を出力します
22: DXライブラリ Ver3.19
25: 論理プロセッサの数 : 4
27: OS Windows8.1 ( Build 9600 )
131: 現時点のCPU動作速度:大体3.58GHz
133: MMX命令を使用します
135: SSE命令が使用可能です
137: SSE2命令が使用可能です
139: CPUベンダ:GenuineIntel
149: CPU名:Intel(R) Core(TM) i3-4160 CPU @ 3.60GHz
151: COMの初期化... 成功
157: 非同期読み込み処理の初期化...成功
176: ファイルアクセス処理の初期化...成功
183: メモリ総量:4019.87MB 空きメモリ領域:1201.16MB
185: タイマーの精度を検査します
187: 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
189: パフォーマンスカウンターを使用します タイマー精度 : 3507.502000 KHz
193: ソフトの二重起動検査... 二重起動はされていませんでした
200: ウインドウクラスを登録します... 登録に成功しました
204: ウインドウモード起動用のウインドウを作成します
206: ディスプレイ情報のセットアップ開始
208: モニターの数:2 ディスプレイデバイスの数:2
210: No.0 モニター名:\\.\DISPLAY1 1920x1080 32bit 60Hz
212: No.1 モニター名:\\.\DISPLAY2 1920x1080 32bit 60Hz
223: ディスプレイ情報のセットアップ完了
226: ウインドウの作成に成功しました
228: ウインドウを表示します
238: IMEを無効にしました
240: ウインドウスタイルをウインドウモード用に変更します... 完了
264: DirectInput関係初期化処理
266: XInput DLL の読み込み中... 成功
272: DirectInput7 の取得中... DirectInput8 の取得を試みます...成功
293: 引き続き初期化処理... 初期化成功
300: ジョイパッドの初期化...
303: ジョイパッドの初期化は正常に終了しました
306: マウスデバイスの初期化... 初期化成功
310: キーボードデバイスの初期化... 初期化成功
315: DirectInput 関連の初期化は正常に終了しました
325: DirectSound の初期化を行います
327: DirectSound インターフェースの取得を行います.... 成功
335: 引き続きインターフェースの初期化処理... 成功
370: DirectSound デバイスを列挙します
373: Module Name : Description : プライマリ サウンド ドライバー
375: Module Name : {0.0.0.00000000}.{e67a1530-1a83-43f8-8902-9245bdde8554} Description : スピーカー (Realtek High Definition Audio)
377: Module Name : {0.0.0.00000000}.{8c9a8e38-6817-4384-9161-bc247b4117cc} Description : BenQ GW2265-1 (NVIDIA High Definition Audio)
379: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz
382: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB
384: 利用可能サンプリング精度
386: Primary 16bit = OK 8bit = OK
388: Secondary 16bit = OK 8bit = OK
390: 利用可能チャンネル
392: Primary MONO = OK STEREO = OK
394: Secondary MONO = OK STEREO = OK
396: DirectSound の初期化は正常に終了しました
400: d3d11.dll の読み込み.... 成功
407: dxgi.dll の読み込み.... 成功
412: API CreateDXGIFactory1 のアドレスを取得します.... 成功
417: IDXGIFactory1 を作成します.... 成功
424: API D3D11CreateDevice のアドレスを取得します.... 成功
428: IDXGIAdapter を取得します.... 成功
433: Direct3D 11 FeatureLevel 11_0 以上を対象とします
435: ID3D11Device オブジェクトを取得します.... 失敗
456: d3d11.dll の解放 1
459: dxgi.dll の解放 1
461: Direct3D11 のオブジェクト数を出力
463: Direct3D11 のオブジェクト合計数 : 0
469: DirectDraw オブジェクトの取得を行います.... 成功
476: 引き続き初期化処理... 初期化に成功しました
497: IDirect3D9Ex オブジェクトを取得します.... 成功
504: IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します
780: 成功
784: Driver:nvd3dum.dll Description:NVIDIA GeForce 210
786: 画面のフォーマットは D3DFMT_X8R8G8B8 です
789: 16bit Zバッファフォーマットは D3DFMT_D16 です
792: 24bit Zバッファフォーマットは D3DFMT_D24X8 です
794: 32bit Zバッファフォーマットは D3DFMT_D24X8 です
796: 16bit カラーフォーマットは D3DFMT_R5G6B5 です
799: 32bit カラーフォーマットは D3DFMT_X8R8G8B8 です
801: アルファ付き 16bit カラーフォーマットは D3DFMT_A4R4G4B4 です
803: アルファ付き 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です
805: アルファテスト用 16bit カラーフォーマットは D3DFMT_A1R5G5B5 です
807: アルファテスト用 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です
808: DXT1テクスチャフォーマットはD3DFMT_DXT1 です
810: DXT2テクスチャフォーマットはD3DFMT_DXT2 です
812: DXT3テクスチャフォーマットはD3DFMT_DXT3 です
814: DXT4テクスチャフォーマットはD3DFMT_DXT4 です
816: DXT5テクスチャフォーマットはD3DFMT_DXT5 です
818: ABGR 整数 16 ビット型カラーフォーマットは D3DFMT_A16B16G16R16 です
820: ABGR 浮動小数点 16 ビット型カラーフォーマットは D3DFMT_A16B16G16R16F です
822: ABGR 浮動小数点 32 ビット型カラーフォーマットは D3DFMT_A32B32G32R32F です
824: 1チャンネル整数 8 ビット型カラーフォーマットは D3DFMT_A8R8G8B8 です
826: 1チャンネル整数 16 ビット型カラーフォーマットは D3DFMT_G16R16 です
828: 1チャンネル浮動小数点 16 ビット型カラーフォーマットは D3DFMT_R16F です
829: 1チャンネル浮動小数点 32 ビット型カラーフォーマットは D3DFMT_R32F です
831: 2チャンネル整数 8 ビット型カラーフォーマットは D3DFMT_A8B8G8R8 です
833: 2チャンネル整数 16 ビット型カラーフォーマットは D3DFMT_G16R16 です
835: 2チャンネル浮動小数点 16 ビット型カラーフォーマットは D3DFMT_G16R16F です
837: 2チャンネル浮動小数点 32 ビット型カラーフォーマットは D3DFMT_G32R32F です
838: 描画用 16bit カラーフォーマットは D3DFMT_R5G5B5 です
840: 描画用 32bit カラーフォーマットは D3DFMT_X8R8G8B8 です
842: 描画用アルファ付き 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です
843: 描画用 ABGR 整数 16 ビット型カラーフォーマットは D3DFMT_A16B16G16R16 です
845: 描画用 ABGR 浮動小数点 16 ビット型カラーフォーマットは D3DFMT_A16B16G16R16F です
847: 描画用 ABGR 浮動小数点 32 ビット型カラーフォーマットは D3DFMT_A32B32G32R32F です
849: 描画用1チャンネル整数 8 ビット型カラーフォーマットは D3DFMT_L8 です
851: 描画用1チャンネル整数 16 ビット型カラーフォーマットは D3DFMT_L16 です
853: 描画用1チャンネル浮動小数点 16 ビット型カラーフォーマットは D3DFMT_R16F です
854: 描画用1チャンネル浮動小数点 32 ビット型カラーフォーマットは D3DFMT_R32F です
856: 描画用2チャンネル整数 8 ビット型カラーフォーマットは D3DFMT_A8B8G8R8 です
858: 描画用2チャンネル整数 16 ビット型カラーフォーマットは D3DFMT_G16R16 です
860: 描画用2チャンネル浮動小数点 16 ビット型カラーフォーマットは D3DFMT_G16R16F です
861: 描画用2チャンネル浮動小数点 32 ビット型カラーフォーマットは D3DFMT_G32R32F です
863: A8R8G8B8 カラーフォーマットは頂点テクスチャフェッチに使用できません
865: X8R8G8B8 カラーフォーマットは頂点テクスチャフェッチに使用できません
868: R5G6B5 カラーフォーマットは頂点テクスチャフェッチに使用できません
871: A1R5G5B5 カラーフォーマットは頂点テクスチャフェッチに使用できません
873: X1R5G5B5 カラーフォーマットは頂点テクスチャフェッチに使用できません
875: 一度に描画できるプリミティブの最大数:8388607
877: 対応している最大頂点インデックス:16777215
879: 同時にレンダリングできるバッファの数:4
881: 最大テクスチャサイズ 幅:8192 高さ:8192
884: テクスチャステージテンポラリレジスタ:使用可
885: 減算合成のハードウェア対応:ネイティブ
887: ハードウェア頂点シェーダーバージョンコード:300
889: エミュレーション頂点シェーダーバージョンコード:エミュレーション無し
891: ピクセルシェーダーバージョンコード:300
906: バックバッファロック転送の時間:91nsec 一時的な描画可能バッファを使用した転送の時間:531nsec
911: バックバッファロックを使用します
913: Zバッファを作成します.... 成功
1190: プログラマブルシェーダーを使用します
1248: フォントの初期化を行います
1253: フォントの初期化は正常に終了しました
1269: 文字コードバッファの初期化を行います... 完了しました
1284:DXライブラリの初期化処理終了