WCHARって何ですか? 文字列の変換

これまでchar型でしか文字列を扱ったことがなかったので、DirectXTexの画像ファイル読み込みでLPCWSTR(const WCHAR*)という型を見ても特に気にせず、L”文字列”と書けばいいやぐらいしか考えてませんでした。しかし、リテラルではなくconst char*のファイルパスを渡そうとするとコンパイルエラー、どうやら簡単に型のキャストで済むようなものではないらしい。

WCHAR( wchar_t )とは
Wikipedia ワイド文字
その他、ググって調べてみた。

文字列の内部表現が違うので、テキストファイル(char)から取得した文字列をそのままでは使えず、変換する必要があるようです。「wchar_t = 1文字」とは限らないので取扱いに注意(なんか中途半端な文字型のような気がする)。
C++11ではchar16_tやchar32_tという文字型があるので、今後慎重に文字列型の扱い方を考えていきたい。

文字列の変換方法を調べていくつか作成してみました。
続きを読む WCHARって何ですか? 文字列の変換

boost spirit qiでmqo(メタセコイア)ファイル解析&とりあえず描画

ポリゴンが描画できるようになったので、今度はモデルデータファイルを読み込んで表示してみる。モデルデータは、データ作成と解析が簡単にできるmqoファイル(メタセコイアの出力ファイル、テキスト形式)を使用する。

とりあえずmqoファイル表示
とりあえずmqoファイル表示

続きを読む boost spirit qiでmqo(メタセコイア)ファイル解析&とりあえず描画

DirectX11 スマートポインタ活用 BoostとC++11

これまでプログラムしていて、これは危険かもしれないと感じるソースコードがありました。

これのback_buff->Release();
GetBufferで取得したテクスチャを使用後Releaseが必要ですが、書き忘れる自信があります。というか忘れてました。単純なプログラムであればVisualStuioのデバッグですぐにリークが検出され修正個所もすぐに発見できますが、複雑になってくるとそうはいきません。
というわけで、スマートポインタをつかって自動的にRelease関数を呼ぶようにします。

続きを読む DirectX11 スマートポインタ活用 BoostとC++11

DirectX11 テクスチャ3Dポリゴン描画

テクスチャ使用の準備ができたので、テクスチャを貼ったポリゴンを表示してみる。
さらに、シェーダに行列パラメータを渡して3次元に。

テクスチャ3Dポリゴン描画
テクスチャ3Dポリゴン描画
2Dポリゴン描画にテクスチャ画像読み込みとシェーダへのパラメータ(行列、テクスチャなど)を渡す処理を追加。テクスチャ処理にはDirectXTexを利用。シェーダのパラメータ取得方法が少し変わっていたが、サンプルやドキュメントなどを参考にしてシェーダプログラムを作成。
定数レジスタが定数バッファに変わっただけかと思ってましたが、更新頻度などでグループ化(最大16)できるので、効率の良いプログラムが作れそう。

続きを読む DirectX11 テクスチャ3Dポリゴン描画

VS2012 ライブラリ(lib)のリンク _ITERATOR_DEBUG_LEVELとRuntimeLibrary

DirectX11 DirectXTexでテクスチャ対応でReleaseビルドしたlibファイルをDebugビルドで使用するとライブラリ実装の不一致エラーが出てしまう問題を回避してみる。(libファイルだけ公開されているライブラリを組み込むときに同じ問題が発生するかもしれないので)

続きを読む VS2012 ライブラリ(lib)のリンク _ITERATOR_DEBUG_LEVELとRuntimeLibrary

DirectX11 DirectXTexでテクスチャ対応

テクスチャを貼ったポリゴンを表示してみようとしてサンプルプログラムを見てみるとなんか以前作成したものと様子が違う。D3DX11CreateTextuteFromFileで簡単にテクスチャ画像が読み込めるはずだったのに。
調べてみるとD3DX11系の便利関数は、SDKから削除されていました。使用する場合は個別に公開されているライブラリ
DirectXTex http://directxtex.codeplex.com/
DirectXTK http://directxtk.codeplex.com/
を利用します。
今回は、テクスチャ関連の機能を使うため、DirectXTexをダウンロードして、作成したプログラムに組み込みました。
続きを読む DirectX11 DirectXTexでテクスチャ対応

security development lifecycle(SDL)チェック VisualStudio2012

VS2012で新規プロジェクト作成時に見慣れないチェックボックス
□security development lifecycle(SDL)チェック
というものを発見。
security development lifecycleでぐぐると
http://msdn.microsoft.com/ja-jp/library/ms995349.aspx
というページを見つけたけどなんか違う。
さらに調べてみるとSDLチェックについて書かれたブログを見つけました。
VisualStudio2012で古い関数を使う(SDLチェック)

strcpy_sなどのセキュリティ強化版の関数の使用を強制するかどうかの設定でした。
ためしにstrcpyを使用するとコンパイラエラー、無効にすると警告が出るけどコンパイル成功(?)。
strcpyなどの関数は、範囲外のメモリアクセスが発生して厄介なバグを引き起こすので、SDLチェックは有効にしておく。

SDLチェックの有無は
プロジェクトのプロパティ>構成プロパティ>C/C++>全般>SDLチェック

DirectXMath

DirectX11のプログラムができるようになったので、次は3Dグラフィックスの表示といきたいところですが、その前に3DCGで必要になるベクトルや行列の計算を行うライブラリを準備します。
DirextX9や10に含まれる計算関数、XNAMath(マイクロソフトが提供するゲーム作成環境XNAの計算ライブラリ)などを使う予定でしたが、DirectXMathという計算ライブラリがあるようなので、これを使うことにしました。

DirectXMath Programming Guide (Windows)を参考に。
DirectXMath (Windows)からだと日本語のページがなくXNAMathのページへ、仕方なく英語で。
DirectXMathの特徴
・DirextX9、10、XNAMathに代わる計算ライブラリ
・インライン定義のみ(ヘッダファイルのみリンクなし)
・SSE/SSE2やARM-NEONなどのCPU命令を使用(ベクトル計算を高速に)
・CPU毎に実行ファイルを用意する必要がある(インライン定義なので)
最後が少し気になるけど、SSE/SSE2対応CPUに限定してプログラミングするので問題なし。
DirectXMath.hは現在インストールしているWindowsSDKに含まれているので、使用するにはDirectXMath.hをincludeするのみ。

検証用ソースコード(CPU判定と意味のない計算をするだけ)

まず最初に、DirectX::XMVerifyCPUSupport()でCPUが対応しているか調べ、未対応の場合プログラムを実行できないので、強制終了などのエラー処理が必要なります。XMVerifyCPUSupportを使用するときは、DirectXMath.hのincludeの前にwindows.hをincludeする必要があります。
あとはDirectXMath Programming Guide (Windows)を参考にベクトルや行列の計算を試してみました。デバッガでの確認ですが計算は正しく行われているようです。

これで計算ライブラリの準備完了。
使い方は必要に応じて調べていきます。

DirectXMath (Windows)
DirectXMath Programming Guide (Windows)

ゲームプログラミングの素