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

投稿日:

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

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

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

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

投稿日:

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

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

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

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

投稿日:

準備期間を終えて正式スタート。最初の課題は「ライトプリパスレンダリング」です。まずは、必要になりそうな処理、MRT(マルチレンダーターゲット)、G(ジオメトリ)バッファの生成、レンダリング結果をテクスチャとして使用、などを調査検証してみる。

左上:法線 右上:デプス⇒ワールド座標 左下:Diffuse 右下:輪郭線(赤)&影(青)
左上:法線 右上:デプス⇒ワールド座標
左下:Diffuse 右下:輪郭線(赤)&影(青)

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

ジオメトリシェーダでステンシルシャドウ&最適化

投稿日:

ジオメトリシェーダでステンシルシャドウを実装してみます。以前(DX9など)はシャドウボリュームの生成が面倒でしたが、ジオメトリシェーダを使うことによって簡単にできそうです。それと、単純な実装ではピクセルシェーダの負荷が大きすぎるため、できるだけシャドウボリュームの描画を減らす最適化も同時に行います。

ステンシルシャドウ
ステンシルシャドウ

続きを読む ジオメトリシェーダでステンシルシャドウ&最適化

ジオメトリシェーダで輪郭線表示

投稿日:

ジオメトリシェーダを使って輪郭線を表示してみます。方法は法線方向への拡大&裏面描画ではなく、ポリゴンエッジに輪郭線をつけるかどうか判定し、エッジ(辺)に沿ってラインを描画します。

ジオメトリシェーダで輪郭線
ジオメトリシェーダで輪郭線

続きを読む ジオメトリシェーダで輪郭線表示

位置を共有している頂点のマージアルゴリズム

投稿日:

3Dモデルデータの最適化のために、ほぼ同じ位置にある頂点データを1つにまとめる(マージする)処理を作成します。総当たりで近い位置にあるか比較していけば簡単に実装できると思っていました……
これまでの経験では数千頂点程度のマージ処理だったので、それほど実行速度を気にすることはありませんでした。が、今回約70000頂点のマージを総当たり比較で処理したところ、処理時間1分間以上。違う方法を考えなければ。

続きを読む 位置を共有している頂点のマージアルゴリズム

頂点シェーダでスキニングと頂点ブレンド 可変長の定数バッファ

投稿日:

頂点シェーダでスキニングと頂点ブレンドを行います。基本的な原理などは多くの場所で公開されているので省略、DirectX11での実装について説明します。
ボーンウエイト付のモデルデータは自作できないので、入手しやすいPMD/VMDファイルを使用します。

PMD/VMDの表示再生
PMD/VMDの表示再生

続きを読む 頂点シェーダでスキニングと頂点ブレンド 可変長の定数バッファ