カテゴリー別アーカイブ: DirectX

DirectX関連プログラム

DX11エフェクトシステム作成 Part4 ツール作成

コンパイル結果をバイナリデータに、コンパイラをオフラインツールにしてVisualStudioに組み込みます。バイナリデータは、ファイル出力とC++ソースコード(配列データ)の2形式で出力できるようにする。VSの組み込みはカスタムビルド。
とりあえず、これで完成。これまでで得られたもの、シェーダの知識(変数、コンパイル)、字句解析処理、カスタムビルドの方法など。

続きを読む DX11エフェクトシステム作成 Part4 ツール作成

D3DCOMPILER_xx.dllがない! シェーダのコンパイルについて

DirectX11プログラムでシェーダのコンパイルを行っているとexeファイルを起動時に”D3DCOMPILER_xx.dllがない”というエラーが発生して起動できません。VisualStudio2012のデバッガで実行した場合は起動できます。単純にdllをインストールすればいいといわけではなさそうなので調査してみる。

続きを読む D3DCOMPILER_xx.dllがない! シェーダのコンパイルについて

DX11エフェクトシステム作成 Part2 コンパイラ作成

FXファイルのコンパイラを作成します。ただし一部の仕様のみに対応した簡易コンパイラです。複雑な構文解析は行わないので、文字列によって処理を分岐させる程度のプログラムになります。

続きを読む DX11エフェクトシステム作成 Part2 コンパイラ作成

DX11エフェクトシステムの作成 Part1 FXファイル解析

DirectX11ではEffect関連の機能が削除されていて、使用するには別途公開されているEffects11ソースコードが必要なります。しかし、その説明には古いコードの移植支援とあるため、あまり推奨されているものではないようです。
そこで、EffectのFXファイルを使用した独自のエフェクトシステムを作成してみます。
まず最初はFXファイル(HLSL)の字句解析と構文解析を行い必要な情報を取得できるようにします。

続きを読む DX11エフェクトシステムの作成 Part1 FXファイル解析

D3DPreprocessでプリプロセス

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

続きを読む D3DPreprocessでプリプロセス

ライトプリパスレンダリング Part3 アンチエイリアス

アンチエイリアス処理を行います。MSAAによるAAを試しましたがうまくいかなかったため、ポストプロセス処理のAAであるSMAA(Enhanced Subpixel Morphological Antialiasing)を実装してみました。かなりいい感じです。ただ、輪郭線処理との相性が悪いため輪郭線描画は無効にしています。
ライトプリパスレンダリングのプログラム作成は、ここで一旦終了します。

SMAA 1x
SMAA 1x

続きを読む ライトプリパスレンダリング Part3 アンチエイリアス

ライトプリパスレンダリング Part2 光源計算&最適化

光源計算の処理と最適化を行います。点光源などの影響範囲が限定されている場合、計算が必要なピクセルを検出することで処理時間を短縮します。

左上:法線 右上:Specular 左下:最終結果 右下:Diffuse
左上:法線 右上:Specular 
左下:最終結果 右下:Diffuse

続きを読む ライトプリパスレンダリング Part2 光源計算&最適化

ライトプリパスレンダリング Part1

ライトプリパスレンダリングの基本的な処理を作成します。ジオメトリバッファの作成、光源計算、最終レンダリングの3つのパスでレンダリングします。それとこれまでに作成した、輪郭線とステンシルシャドウも組み込んでみます。

左上:法線 右上:Specular 左下:最終結果  右下:Diffuse
左上:法線 右上:Specular
左下:最終結果 右下:Diffuse&Shadow

続きを読む ライトプリパスレンダリング Part1

ID3D11InfoQueueで特定の警告、エラーメッセージを無効化

DirectX11のデバッグ機能を有効(D3D11_CREATE_DEVICE_DEBUG)にすると、問題発生時にエラーメッセージが出力されます。しかし、場合によっては大量にメッセージが出力されて、必要なメッセージが埋もれてしまうことがあります。これを解決するためにID3D11InfoQueueを使って、特定のメッセージ(重要度が低い、大量に出力)を無効化します。

続きを読む ID3D11InfoQueueで特定の警告、エラーメッセージを無効化