Advanced Search
Search Results
197 total results found
その1
第1章:シャドウマップの考え方 この章の目的 コードを書く前に、なぜ「ライトから見たZ値」を比べると影がわかるのかを理解する。 この章は説明だけ。コード変更はしない。 1. 普通のライト計算だけでは影は出ない 今のライト計算では、だいたい次のことをしている。 面の向きとライト方向を比べる ↓ ライトの方を向いていれば明るい ライトと逆を向いていれば暗い これは「その面がライト方向を向いているか」を見ているだけ。 しかし、影を出すには次のことも調べる必要がある。 ライトとその場所の間に、別の物体があるか 手前に...
その2
第2章:ライトを仮想カメラとして扱う この章の目的 シャドウマップを作るには、ライトから見た画面が必要になる。 そのために、ライト用のビュー行列と射影行列を追加する。 この章では、まだ画面は変わらない。 考え方 普通の描画では、カメラから見た画面を作っている。 カメラ位置 ↓ 見る シーン シャドウマップでは、ライトから見た画面を作る。 ライト視点の仮想カメラ位置 ↓ 見る シーン 今回のライトは平行光源として扱う。 平行光源には本来「位置」はない。 しかし、シャドウマップを作るには「ライトから見た画...
その3
第3章:シャドウマップ用テクスチャを作る この章の目的 ライトから見たZ値を保存するためのテクスチャを作る。 まだそのテクスチャには何も描かない。 この章でも画面は変わらない。 考え方 シャドウマップは普通の色画像ではない。 色を保存する画像ではなく、ライトから見たZ値を保存する画像 DirectXでは、テクスチャ本体と、その使い道を分けて考える。 ID3D11Texture2D ├─ DepthStencilView : 深度を書き込む口 └─ ShaderResourceView : シェーダー...
その4
第4章:深度だけを書く ShadowMap.hlsl を作る この章の目的 ライト視点で深度だけを書くための専用シェーダーを作る。 通常描画用の Simple3D.hlsl とは別に、ShadowMap.hlsl を追加する。 この章でも画面は変わらない。 考え方 通常描画では、色・テクスチャ・ライト計算を使う。 しかしシャドウマップ作成では、必要なのはライトから見たZ値だけ。 必要:頂点をライト視点に変換する 不要:色、テクスチャ、ライティング ピクセルシェーダーは何もしなくてよい。 SV_POSITION ...
その5
第5章:モデルをシャドウマップに描けるようにする この章の目的 通常描画用の Draw() とは別に、シャドウマップ作成用の DrawShadow() を追加する。 この章でも画面は変わらない。 考え方 普通の Draw() は、画面に表示するための描画。 Draw() 色を出す テクスチャを読む ライト計算をする カメラ視点で描く シャドウマップ用の描画では、色はいらない。 DrawShadow() 色を出さない テクスチャを読まない ライト計算もしない ライト視点のWVPだけ...
その6
第6章:描画を2パス構成にする この章でやること Stage::Draw() の描画を2回に分けます。 パス1:ライト視点で深度だけ描く(シャドウパス) パス2:カメラ視点で普通に描く(メインパス) あわせて、第7章でシェーダーがライトVP行列を使えるよう、 CONSTANTBUFFER_STAGE に matLightVP を追加して毎フレーム送ります。 この章が終わっても画面の見た目は変わりません。 影が出るのは第7章からです。 この章でのコード変更点 ファイル 変更内容 Stage.h CO...
その7
第7章:Simple3D.hlslで深度比較して影を出す この章でやること Simple3D.hlsl のピクセルシェーダーで、シャドウマップを読んで影を判定します。 この章で初めて画面に影が出ます。 ただし影のエッジはジャギー(ギザギザ)になります。 なめらかにするのは第8章で行います。 この章でのコード変更点 ファイル 変更内容 Stage.cpp メインパスの前後にシャドウマップSRVをセット/解除 Simple3D.hlsl g_shadowMap・g_shadowSampler の宣言...
その8
第8章:比較サンプラーで影のエッジをなめらかにする この章でやること 影のエッジのジャギー(ギザギザ)を改善します。 第7章では Sample() で1点だけ読んで影を判定していました。 この章では SampleCmpLevelZero() に差し替えて、近隣の複数点を平均した判定にします。 この章が終わると影のエッジが少しなめらかになります。 この章でのコード変更点 ファイル 変更内容 Simple3D.hlsl SamplerState を SamplerComparisonState に変更(...
その9(おまけ)
第9章:影が出ないときの確認ポイント 目的 つまずきやすいところを、症状別に確認できるようにする。 1. 影がまったく出ない 確認すること Stage::Draw() で Direct3D::BeginShadowPass() を呼んでいるか。 Model::DrawShadow(hDonut_) を呼んでいるか。 Direct3D::EndShadowPass() を呼んでいるか。 Stage::Draw() のメインパス前に PSSetShaderResources(1, 1, &pShadowSRV) を...
DirectXTKとAudio
Step 00 DirectXTK Audio の基本 この回の目的 この回では、DirectXTK Audio で使う基本的なクラスの役割を整理します。 音を鳴らすプログラムでは、いきなりコードを書く前に、次の3つを分けて考えることが大切です。 AudioEngine … 音を鳴らす仕組み全体 SoundEffect … 音声ファイル1個分のデータ SoundEffectInstance … 実際に再生中の音 この3つの違いが分かると、DirectXTK Audio ...
前準備その2 スマポ
スマートポインタ入門 目的 この資料では、C++ の std::unique_ptr の基本的な使い方を学びます。 今回の目標は、スマートポインタを深く理解することではありません。 まずは、次のことが分かれば十分です。 new で作ったものは delete で消す必要がある std::unique_ptr を使うと delete を自動でやってくれる std::make_unique は unique_ptr 用の new のようなもの この考え方を使って、あとで DirectXTK Audio の AudioE...
01 音を鳴らしてみるだけ
第1回 DirectXTK Audioで音を1回鳴らす この回に入る前に 先にDirectXTKとAudio を読み、次の3つの役割を確認しておきます。 AudioEngine : 音を鳴らす仕組み本体 SoundEffect : wavファイルを読み込んだ音データ SoundEffectInstance : 再生中の音を操作するもの この回では、まず AudioEngine と SoundEffect だけを使います。 目標 この回では、DirectXTK Audioを使って、...
02 Engineに組み込んでゆくぅ
第2回 Audio機能をEngineに組み込んでゆくぅ 目標 この回では、第1回で TestScene に直接書いた音声処理を、エンジン側の機能として分離します。 最終的に、ゲーム側から次のように使える形にします。 file_path testPath = "Assets/Audio/test.wav"; Audio::Load("test", testPath); Audio::Play("test"); DirectXTK Audioの細かい処理は、Audio の中に隠します。 今回変更するファイル Eng...
03 SEとBGMを別扱いに(なんで?)
第3回 効果音とBGMを分ける 目標 この回では、Audio機能を次の2種類に分けます。 SE : 効果音。短い音。何度も鳴る。 BGM : 背景音楽。長い音。基本的に1曲を流し続ける。 最終的に、次のように使える形にします。 file_path shotPath = "Assets/Audio/SE/shot.wav"; file_path stagePath = "Assets/Audio/BGM/stage.wav"; Audio::LoadSE("shot", shotPath); Audio::Lo...
04 サウンドのコントロール機能(簡単なのだけ)
第4回 音量管理とBGMフェード 目標 この回では、オーディオエンジンに音量管理を追加します。 次の3種類の音量を扱います。 MasterVolume : 全体の音量 SEVolume : 効果音の音量 BGMVolume : BGMの音量 さらに、BGMのフェードアウトも追加します。 シーン切り替え時に、音を急に止めず、自然に小さくできます。 今回変更するファイル Engine/Audio.h Engine/Audio.cpp TestScene.cpp 今回のフェード処理について この資料...
05 応用編 3D音響
第5回 AudioSourceと3D Audio 目標 この回では、音に位置を持たせます。 通常の効果音は、画面全体に同じように聞こえます。 3D Audioでは、音源の位置とカメラの位置を使って、左右の聞こえ方や距離による音量変化を作ります。 この回の最終形は次の使い方です。 Audio::SetListener(cameraPosition, cameraForward, cameraUp); Audio::PlaySE3D("explosion", soundPosition); さらに、音を鳴らす部品とし...
状態遷移ふたたび
ゲームAI課題 センサー・視界・状態遷移表・状態遷移図を書いてみよう 1. 今日の課題 今回の課題では、モンスターAIの行動を センサー 視界 状態遷移表 状態遷移図 として整理します。 プログラムは書きません。 しかし、最後に C++ の switch case や State パターンへ変換できるように、条件や状態をきちんと整理します。 2. 今日のゴール この課題のゴールは、次の4つです。 1. モンスターが何を調べているのかを考える 2. センサーの結果をフラグとして整理する 3. 状態遷移表を書ける...
ステートパターン(オブジェクト指向的)
C++ Stateパターン入門 センサー・状態遷移表・状態遷移図をクラス設計に変換しよう 今日のテーマ 前回は、モンスターAIを次の流れで整理しました。 センサーで状況を調べる ↓ フラグにする ↓ 状態を決める ↓ 状態遷移表を書く ↓ 状態遷移図を書く 今回は、その状態遷移表と状態遷移図を、C++の設計に変換します。 今回のテーマは、 Stateパターン です。 今日のゴール 今日のゴールは、次の3つです。 1. Stateパターンが何のためにあるのか理解する 2. switch case版との違い...
Stateパターンワーク
C++ Stateパターン入門 信号機のStateクラスで考える 1. 今日の目的 この資料では、Stateパターンを信号機の例で学びます。 難しいゲームAIではなく、次の3つの状態だけを扱います。 赤 青 黄 信号機は、時間が来ると状態が変わります。 赤 → 青 → 黄 → 赤 このような「状態ごとに処理が違うもの」を、Stateパターンで書いてみます。 2. Stateパターンを一言でいうと Stateパターンは、 状態ごとの処理を、状態ごとのクラスに分ける方法 です。 信号機なら、次のように分けます...
ゲーム研究(自作に向けて)ワーク(6月18日)
自分が作りたいジャンルのゲーム解析ワーク 目的 これまでのワークでは、ゲームの面白さを考えるために、入力、出力、ルール、報酬、リスク、フィードバック、UIなどを分析してきました。 今回のワークでは、その総まとめとして、自分が今一番作ってみたいゲームのジャンルを1つ決め、そのジャンルのゲームを複数調べます。 そして、これまで学んだ解析項目を使って、そのジャンルのゲームにはどのような工夫がされているのかを整理します。 最後に、調べた内容をもとに、制作で意識するべき点をまとめます。 このワークのゴール このワークのゴー...