macOSでOpenGLプログラミング（目次）

# はじめに

2017年8月24日現在、iOSプログラミングに押されて、Macプログラミングの情報がかなり少なくなっています。この記事では、最新のmacOS 10.13とXcode 9を使って、OpenGLを使ったゲームを作る方法を解説します。

この記事を読むことで、最新のmacOSと、現代的なOpenGLを使ったゲーム制作（というよりはゲーム制作のためのミドルウェアの作り方）が理解できるようになることを目的としています。

macOSに最初から用意されているフレームワークだけを使用し、必要なコードはなるべく外部ライブラリを使わずに自前で実装することを前提として解説していきます。そのため、既存のライブラリを導入した方が堅牢になる箇所も多々あると思いますが、何をどのように処理しているかがブラックボックスに包まれないように、基本の考え方が分かりやすいように解説していきたいと思います。

# 目次

## 1章　基本環境の整備

- 1-1. [プロジェクトの作成〜OpenGLの基本設定](http://qiita.com/sazameki/items/12adb193dc1472c6316a)
- 1-2. [ウィンドウのリサイズ方法の調整](http://qiita.com/sazameki/items/86d6f320cebd80ba2f77)
- 1-3. [ゲーム更新用のループを作る](http://qiita.com/sazameki/items/ff6e2c588a5ac785ad83)
- 1-4. [ゲーム終了時の処理を行う](http://qiita.com/sazameki/items/da9ffe26c5f269ac8e27)
- 1-5. [ゲーム処理を書くためのC++クラスを作る](http://qiita.com/sazameki/items/3d39211cc102a0c6b815)
- 1-6. [C++の文字列処理のサポート関数を追加する](http://qiita.com/sazameki/items/73bca6d720f43a8ac9f8)
- 1-7. [経過時間とFPSの測定](http://qiita.com/sazameki/items/138e943286238691a417)
- 1-8. [キーボード操作をサポートする](http://qiita.com/sazameki/items/b047df7ee21d96b70548)
- 1-9. [マウス操作をサポートする](https://qiita.com/sazameki/items/68baa657b2f6488f7704)
- 1-10. [OpenGLの環境を確認する](http://qiita.com/sazameki/items/6b9870100a1081cedd25)


## 2章　シェーダによる描画の基礎

- 2-1. [シェーダを書いて三角形を表示する](http://qiita.com/sazameki/items/e60848466f7016e48b14)
- 2-2. [構造体とvectorを使って頂点データを指定する](http://qiita.com/sazameki/items/4eab1b846992899e1e61)
- 2-3. [頂点のインデックス・リストを使って描画する](http://qiita.com/sazameki/items/d208d8762c5cbb3b4fc9)
- 2-4. [テクスチャを表示する](http://qiita.com/sazameki/items/857720471e1be85210f2)
- 2-5. [複数テクスチャを組み合わせる](http://qiita.com/sazameki/items/8529169d355df667bed6)
- 2-6. [頂点データにGLKitの構造体を使う](http://qiita.com/sazameki/items/aa632b89c5006b158b01)
- 2-7. 頂点データをゲーム実行中に移動させる（未投稿ですが、[@uechoco@github](https://qiita.com/uechoco@github)さんが [OpenGLのVBOの頂点データを更新する](https://qiita.com/uechoco@github/items/08e401761bddd17b4c3f?utm_campaign=email&utm_content=link&utm_medium=email&utm_source=public_mention) という記事を書いて下さっています！ぜひ参考にして下さい。ありがとうございます。）


## 3章　3D表現のための透視変換と行列
- 3-1. [行列を使わずに3Dの透視変換を行う](http://qiita.com/sazameki/items/916f06f7c391d8727eba)
- 3-2. [同次座標で3Dの透視変換を行う](http://qiita.com/sazameki/items/b09925d77b9c1c68d63b)
- 3-3. [行列を使って3Dの透視変換を行う](https://qiita.com/sazameki/items/d502d240761cd987648f)
- 3-4. [アスペクト比と画角の調整を行列に組み込む](https://qiita.com/sazameki/items/18623a520c2478c272ec)
- 3-5. [奥行き方向の範囲調整を行列に組み込む](https://qiita.com/sazameki/items/958c26aa8f45ba794279)
- 3-6. [GLKitのプロジェクション行列を使う（左手座標系→右手座標系）](https://qiita.com/sazameki/items/91401f33f72600b5bed5)
- 3-7. [ビュー行列でカメラを動かす](https://qiita.com/sazameki/items/9dc58829517d92643941)
- 3-8. [LookAt()関数でビュー行列を作る](https://qiita.com/sazameki/items/c099f434757e56d54502)
- 3-9. [モデル行列でモデルを動かす](https://qiita.com/sazameki/items/33a726c1de8679937438)
- 3-10. [正射影のプロジェクション行列を作る](https://qiita.com/sazameki/items/b32a0db7249c808c06aa)

[](3-11. 2D描画用のプロジェクション行列を作る)


## 4章　3Dモデルの読み込みと基本のライティング

### 準備

- 準備1. ライティングのための数学（1. ベクトルの正規化）
- 準備2. ライティングのための数学（2. ベクトルのドット積）

### 本編

- 4-1. [基本のライティングを実装する（平行光源の拡散光）](https://qiita.com/sazameki/items/246b113f581f84e1cfbb)
- 4-2. [OBJファイルのモデルを読み込む](https://qiita.com/sazameki/items/5b97c3404d05071b90a4)
- 4-3. [基本のライティングを実装する（平行光源の拡散光に光の色を設定する）](https://qiita.com/sazameki/items/a40210d24b84ab382102)
- 4-4. [基本のライティングを実装する（環境光）](https://qiita.com/sazameki/items/3ee745cf26b30788001a)
- 4-5. [基本のライティングを実装する（平行光源の反射光）](https://qiita.com/sazameki/items/6546d5ee660551288a02)
- 4-6. [Model I/OでOBJファイルを本格的に読み込む](https://qiita.com/sazameki/items/15b9df2fc4cca43aaab6)
- 4-7. 基本のライティングを実装する（点光源）
- 4-8. 基本のライティングを実装する（スポットライト）
- 4-9. 基本のライティングを実装する（オブジェクトの発光）
- 4-10. ライティングの計算を頂点シェーダからフラグメント・シェーダに移す
- 4-11. 複数光源のライティングを実装する
- 4-12. FBXファイルのモデルデータを読み込む
- 4-13. DCCツールを少し触ってみる (MagicaVoxel)
- 4-14. DCCツールを少し触ってみる (Maya, Maya LT)
- 4-15. DCCツールを少し触ってみる (Blender)


## 5章　さらなる3Dの処理

- 5-1. フォグを実装する（距離ベース）
- 5-2. フォグを実装する（ボリュームフォグ）
- 5-3. ブレンディング方法を指定する
- 5-4. カメラを表すCameraクラスを実装する
- 5-5. カメラを回転させる
- 5-6. 複数のカメラを組み合わせる
- 5-7. ビルボードを実装する
- 5-8. バンプマッピングを実装する
- 5-9. 文字を描画する


## 6章　画像処理を行う

- 6-1. Render to Texture を実装する
- 6-2. セピア調の色変換を実装する
- 6-3. モザイク処理を実装する
- 6-4. 鏡の反射を実装する
- 6-5. ラスタースクロールを実装する
- 6-6. トゥーンレンダリングを実装する
- 6-7. リムライトを描画する
- 6-8. カメラの被写界深度を再現する
- 6-9. 光跡を描画する
- 6-10. HDRレンダリングを行う
- 6-11. シャドウ（影）を描画する
- 6-12. 画面のキャプチャ


## 7章　3Dの当たり判定

- 7-1. 線分と線分の衝突判定
- 7-2. 平面と線分の衝突判定
- 7-3. レイ・キャストを実装する
- 7-4. 球と球の衝突判定
- 7-5. 直方体と直方体の衝突判定


## 8章　アニメーションの実装

- 8-1. ボーン・アニメーションを実装する
- 8-2. FBXファイルのアニメーションデータを読み込む
- 8-3. GameplayKitによるステートマシン
- 8-4. 水面の表現
- 8-5. パーティクルの実装（爆発・雨・雪・炎・雷・魔法など、いくつかに分けて説明したい）

## 9章　各種アルゴリズム

- 9-1. 誘導弾の作成（外積などの利用）
- 9-2. GameplayKitによる経路探索
- 9-3. GameplayKitによるエージェント実装
- 9-4. GameplayKitによるルール・システム