Direct3D 12 ゲームグラフィックス実践ガイド

書籍の概要

この本の概要

現役ゲーム開発者が理論と実装で徹底解説

UnityやUnreal Engineをはじめとしたゲームエンジンの発展と普及でゲーム開発は大きな変化を遂げました。
しかしながらより拘った開発のためにはエンジンの内部にも手を掛ける必要があり,ゲームグラフィックスとそれを実現するグラフィックスプログラミングの根本としての考え方や理論,基礎を身につけることが開発者として重要であることに変わりはありません。

本書は現代のグラフィックスプログラミングで使用されているライティング技術の数学的・理論的な基礎からコードとしての実装までをサンプルファイル付きで徹底的に解説しています。
これからゲーム開発に携わりたい業界志望者の方にも,今までの知識を整理したい開発者の方にもおススメです。
「現場で戦うための本当の基本」をこの1冊で身に付けましょう!

こんな方におすすめ

  • 理論から基本を復習したい社会人 1 ~2 年目のプログラマー,グラフィックスプログラマーを目指す学生

この書籍に関連する記事があります!

本気で学ぶ 基礎からのグラフィックスプログラミング
UnityやUnreal Engineをはじめとするゲームエンジンの発展と普及により,ゲーム制作は大きな変化を遂げました。

本書のサンプル

本書の一部ページを,PDFで確認することができます。

目次

Chapter1 プログラミングを始める前に

  • 1.1 コンピュータグラフィックスとテクノロジーの発展
  • 1.2 Direct3D概論
  • 1.3 画面にポリゴンが表示されるまでの工程
    • 1.3.1 大まかな流れ
    • 1.3.2 描画コマンドの作成
    • 1.3.3 レンダリングパイプライン
    • 1.3.4 コンピュートパイプライン
  • 1.4 Direct3D 12はどこが変わった?
    • 1.4.1 コマンドリストとコマンドキュー
    • 1.4.2 パイプラインステート
    • 1.4.3 ディスクリプタ
    • 1.4.4 ルートシグニチャ
    • 1.4.5 バンドル
    • 1.4.6 インダイレクトコマンド
    • 1.4.7 シェーダモデル 6.0
    • 1.4.8 レイトレーシングパイプライン
    • 1.4.9 可変レートシェーディング
    • 1.4.10 メッシュシェーダパイプライン
    • 1.4.11 サンプラーフィードバック
  • 1.5 開発環境の構築
    • 1.5.1 開発環境について
    • 1.5.2 Visual Studioのインストール
    • 1.5.3 グラフィックスツールの設定

Chapter2 ウィンドウの表示

  • 2.1 プロジェクトの作成
  • 2.2 アプリケーションクラスの作成
    • 2.2.1 Appクラスの実装
    • 2.2.2 Appクラスの呼び出し
  • 2.3 Direct3D 12の初期化処理
    • 2.3.1 デバイスの生成
    • 2.3.2 コマンドキューの生成
    • 2.3.3 スワップチェインの生成
    • 2.3.4 コマンドリストの生成
    • 2.3.5 レンダーターゲットビューの生成
    • 2.3.6 フェンスの生成
  • 2.4 Direct3D 12の描画処理
    • 2.4.1 コマンドの記録開始
    • 2.4.2 書き込みのためのリソースバリア
    • 2.4.3 レンダーターゲットビューの設定
    • 2.4.4 表示のためのリソースバリア
    • 2.4.5 コマンドの記録終了とコマンドリストの実行
    • 2.4.6 表示処理
  • 2.5 Direct3D 12の終了処理
  • 2.6 リファクタリング
  • 2.7 スマートポインタの使用
  • 2.8 デバッグフラグの追加
  • 2.9 メモリリークチェック

Chapter3 ポリゴンの表示

  • 3.1 シェーダの準備
    • 3.1.1 シェーダファイルの作成
    • 3.1.2 頂点シェーダの実装
    • 3.1.3 ピクセルシェーダの実装
  • 3.2 描画に必要なインタフェースの生成
  • 3.3 頂点バッファの生成
    • 3.3.1 頂点データの準備
    • 3.3.2 リソースの生成
    • 3.3.3 頂点データの書き込み
    • 3.3.4 頂点バッファビューの設定
  • 3.4 定数バッファの生成
    • 3.4.1 定数バッファデータの定義
    • 3.4.2 ディスクリプタヒープの生成
    • 3.4.3 リソースの生成
    • 3.4.4 定数バッファビューの生成
  • 3.5 ルートシグニチャの生成
    • 3.5.1 ルートパラメータの種類
    • 3.5.2 ルートシグニチャの生成
  • 3.6 グラフィックスパイプラインステー
    • 3.6.1 入力レイアウトの設定
    • 3.6.2 ラスタライザーステートの設定
    • 3.6.3 ブレンドステートの設定
    • 3.6.4 シェーダの設定
    • 3.6.5 パイプラインステートの生成
  • 3.7 描画コマンドの生成
  • 3.8 インデックスバッファ
    • 3.8.1 インデックスバッファの生成
    • 3.8.2 描画処理の変更
  • 3.9 複数図形の描画
    • 3.9.1 Zバッファ法
    • 3.9.2 深度ステンシルビューの生成
    • 3.9.3 深度ステンシルステートの設定
    • 3.9.4 描画処理の変更

Chapter4 テクスチャの表示

  • 4.1 テクスチャとは?
    • 4.1.1 画像形式
    • 4.1.2 テクスチャ座標
    • 4.1.3 テクスチャアドレッシングモード
    • 4.1.4 ミップマップ
    • 4.1.5 テクスチャフィルタリング
  • 4.2 DirectXTKライブラリの利用
    • 4.2.1 DirectXTK12のインストール
    • 4.2.2 テクスチャデータの準備
  • 4.3 テクスチャの描画
    • 4.3.1 シェーダの準備
    • 4.3.2 頂点バッファの変更
    • 4.3.3 ルートシグニチャの変更
    • 4.3.4 テクスチャの生成
    • 4.3.5 描画関数の変更

Chapter5 メッシュの表示

  • 5.1 assimpライブラリを利用したモデルの描画
    • 5.1.1 assimpライブラリのインストール
    • 5.1.2 メッシュファイルの準備
    • 5.1.3 ファイルのロード処理
    • 5.1.4 メッシュデータの変換処理
    • 5.1.5 メッシュの描画
  • 5.2 フレームワークの整備
    • 5.2.1 ディスクリプタプールクラス
    • 5.2.2 テクスチャクラス
    • 5.2.3 定数バッファクラス
    • 5.2.4 メッシュクラス
    • 5.2.5 マテリアルクラス

Chapter6 基本的なライティング

  • 6.1 光と材質
  • 6.2 Lambertモデル
  • 6.3 Phongモデル
  • 6.4 バンプマッピング
    • 6.4.1 法線マップとは?
    • 6.4.2 法線マップの計算方法
    • 6.4.3 接線空間への基底変換
    • 6.4.4 バンプマッピングの実装
    • 6.4.5 ワールド空間への基底変換

Chapter7 光の数値化

  • 7.1 立体角
  • 7.2 光
  • 7.3 放射分析学
    • 7.3.1 放射エネルギー(radiant energy)
    • 7.3.2 放射束(radiant flux)
    • 7.3.3 放射照度(irradiance)
    • 7.3.4 放射発散度(radiant exitance)
    • 7.3.5 放射強度(radiant intensity)
    • 7.3.6 放射輝度(radiance)
  • 7.4 測光学
    • 7.4.1 錐状体
    • 7.4.2 分光視感度(spectral luminous efficacy)
    • 7.4.3 光束(luminous flux)
    • 7.4.4 光度(luminous intensity)
    • 7.4.5 照度(illuminance)
    • 7.4.6 光束発散度(luminous exitance)
    • 7.4.7 輝度(luminance)
  • 7.5 放射量と測光量の単位変換

Chapter8 光伝達のモデル化

  • 8.1 光の伝達を表現するには?
  • 8.2 どのぐらい光が出射される?
    • 8.2.1 双方向散乱面反射率分布関数
    • 8.2.2 双方向反射率分布関数
  • 8.3 BRDFモデル
    • 8.3.1 Lambertモデル
    • 8.3.2 Phongモデル
  • 8.4 オフスペキュラー
    • 8.4.1 フレネル反射
    • 8.4.2 シャドウイングとマスキング
  • 8.5 マイクロファセットに基づくBRDF
    • 8.5.1 マイクロサーフェイス
    • 8.5.2 マイクロサーフェイスの射影
    • 8.5.3 マイクロファセットに基づくBRDFの導出
    • 8.5.4 シャドウイング・マスキング関数
    • 8.5.5 Cook-Torranceモデル
    • 8.5.6 GGXモデル

Chapter9 色を適切に扱う

  • 9.1 色を表現する
    • 9.1.1 混色
    • 9.1.2 等色実験
    • 9.1.3 CIE 1931 RGB表色系
    • 9.1.4 CIE 1931 XYZ表色系
    • 9.1.5 xy色度図
  • 9.2 ディスプレイへの出力
    • 9.2.1 ガンマ補正
    • 9.2.2 伝達関数
    • 9.2.3 色空間の変換
  • 9.3 色の規格
    • 9.3.1 IEC 61966-2-1規格(sRGB規格)
    • 9.3.2 ITU-R BT.709勧告
    • 9.3.3 ITU-R BT.2100勧告
  • 9.4 トーンマッピング
    • 9.4.1 Reinhardトーンマッピング
    • 9.4.2 HDRディスプレイとトーンマッピ
    • 9.4.3 Reinhardトーンマッピングの拡張
    • 9.4.4 GTトーンマップ
  • 9.5 プログラムの実装
    • 9.5.1 HDRサポートのチェック
    • 9.5.2 HDR画像の準備
    • 9.5.3 レンダーターゲットのフォーマッ
    • 9.5.4 色域変換
    • 9.5.5 トーンマッピングの適用
    • 9.5.6 OETFの適用

Chapter10 ライトの種類と表現

  • 10.1 光束と放射束の単位変換
  • 10.2 パンクチュアルライト
    • 10.2.1 ポイントライト
    • 10.2.2 スポットライト
    • 10.2.3 光の減衰
    • 10.2.4 ディレクショナルライト
  • 10.3 フォトメトリックライト
    • 10.3.1 配光測定のための座標系
    • 10.3.2 IESプロファイルの仕様
    • 10.3.3 IESプロファイルの変換
    • 10.3.4 IESプロファイルの適用
  • 10.4 イメージベースドライト
    • 10.4.1 逆変換法
    • 10.4.2 モンテカルロ積分法
    • 10.4.3 ライトプローブのフィルタリング
    • 10.4.4 ライトプローブの評価

Chapter11 メッシュシェーダパイプライン

  • 11.1 メッシュシェーダとは?
  • 11.2 ポリゴンの描画
    • 11.2.1 メッシュシェーダの実装
    • 11.2.2 パイプラインステートの生成
    • 11.2.3 描画コマンドの発行
  • 11.3 メッシュレットを用いた描画
    • 11.3.1 メッシュレットの生成
    • 11.3.2 シェーダの実装
    • 11.3.3 描画メソッドの修正

AppendixA デバッグの仕方

  • A1 基本的なデバッグ操作
    • A1.1 ブレークポイント
    • A1.2 データウォッチ
    • A1.3 ステップ実行
    • A1.4 特定の場所に移動する
    • A1.5 コールスタック
    • A1.6 メモリの表示
    • A1.7 データブレーク
    • A1.8 CRTデバッグライブラリ
    • A1.9 並列スタック/並列ウォッチ
  • A2 Direct3D 12のデバッグ
    • A2.1 デバッグレイヤーの有効化
    • A2.2 GPUクラッシュの解析
  • A3 PIX for Windowsを用いたグラフィックスデバッグ
    • A3.1 インストールとプログラムの起動方法
    • A3.2 GPUキャプチャー方法
    • A3.3 Pipelineビュー
    • A3.4 頂点シェーダのデバッグ
    • A3.5 ピクセルシェーダのデバッグ

AppendixB DirectX Agility SDKの使用

  • B1 Agility SDKの使用方法
  • B2 Agility SDKの動作について

著者プロフィール

Pocol(ぽこる)

ゲームエンジン・ミドルウェアの研究・開発を行っているシニアソフトウェアエンジニア。勉強会主催のほか,個人ホームページ上でプログラムの実例を取り上げながら技術解説を行っている。