D3DPreprocessでプリプロセス

スクリプトやテキストデータを記述する際、Cプリプロセッサの機能があればかなり便利になります。しかし、それを実装するのは大変です。コンパイラ付属のプリプロセッサは入出力がファイルなので使い勝手がわるい。何かないか探していたところDirectxのシェーダコンパイラ関連の関数にD3DPreprocessというものを発見、使ってみる。

D3DPreprocess

D3DPreprocess(MSDN)

HLSLコード用のプリプロセッサですが、スクリプトなどにも使えそうです。ファイルではなくデータ(メモリ)を指定します。引数には処理するデータのほかに、ID3DBlobで結果受け取り、/Dオプションに相当するD3D_SHADER_MACRO、そして#include処理を行うインターフェイスを指定します。

include処理のインターフェイス定義

#includeでのファイル読み込み処理を実装するインターフェイス(クラス)を指定します。プリプロセッサオプション/Iに相当する機能はD3DPreprocessにないためこのクラスで実装します。D3D_COMPILE_STANDARD_FILE_INCLUDEを指定するとデフォルトのinclude処理(カレントディレクトリとpSourceNameのディレクトリの検索)。

プリプロセス結果

コメント除去、include展開、define置き換えが行われます。それとプリプロセス前の行数とincludeしたファイル名がわかるように#lineが追加されます。スクリプトの解析などでエラー発生場所を特定できます(プリプロセス後の行数では発生場所がわからない)。

サンプルコード

includeインターフェイス

使用例

おまけ

OutputDebugStringA関数などでエラー出力を行う場合
ファイルパス(数字):エラー文
という書式で出力すると、ダブルクリックでファイルパスのファイルをVisualStudioのエディタで開き、数字で指定した行数にエディットカーソルが移動した状態になります。
ファイルパス(10,8)
とすると10行、8文字目にカーソルが移動。
プリプロセスでエラーが発生したときに、ダブルクリックでエラー発生場所に移動できたので何か特殊なデバッグ機能がD3DPreprocessに備わっているのではと考えましたが、単にデバッグ出力を特定の書式にすることで有効になる機能でした。スクリプトやテキストデータの解析時に使えそうです。

「D3DPreprocessでプリプロセス」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.