カメラリングとフォグによるグラフィックの高速化処理


# 参考書籍
この記事を書くに当たって、[Unityゲーム プログラミング・バイブル](https://amzn.to/2VGlsN0)内の内容及びサンプルを使用しています。
No.05の内容を実際に動かしながらさらに深掘った内容なので、本書を読みながら読むのが良いと思います。
より詳細な内容が詰まっていて、サンプルプログラムを実際に動かしながら学べるためおすすめです。
<img border="0" src="https://images-na.ssl-images-amazon.com/images/I/61EF%2BnDlbWL._SX258_BO1,204,203,200_.jpg" >
[Unityゲーム プログラミング・バイブル](https://amzn.to/2VGlsN0)

# 描画処理を最適化の必要性
多数のオブジェクトを配置する場合、描画コストが膨大になってしまう。
必要最小限の描画を行うことで処理コストの最適化を計る必要がある。

# カメラリングによる描画範囲の絞り込み
カメラコンポーネント内のClipping Planesの

- Near:描画開始位置
- Far:描画終了位置

を指定すると、描画範囲を指定出来る。
<img width="607" alt="スクリーンショット 2019-10-14 15.56.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/ec0c5dad-a340-157d-b633-4451b7d6c4bd.png">
この範囲が狭ければ狭いほど描画コストは下がるが、ユーザーから見て違和感が無いように調整する必要がある。

## 全範囲表示する場合
- Near:0
- Far:40

<img width="588" alt="スクリーンショット 2019-10-14 15.59.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/7883b4c3-5ec5-0c1e-4708-cbede8995669.png">
一番遠い壁まで見えている。
ただし、描画の最適化は一切されておらず、全てのオブジェクトを描画している状態になっている。

## Nearを遠くしてみる
- Near:2
- Far:40

<img width="603" alt="スクリーンショット 2019-10-14 15.22.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/477ad727-b1eb-59bd-5570-de35326614da.png">
cameraの近くが描画対象外になり、グレーになってしまっている。
一般にユーザーの近くは描画対象になるため、Nearを大きな値にすることはない。

## Farを近くしてみる
- Near:0.01
- Far:1

<img width="620" alt="スクリーンショット 2019-10-14 15.22.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/55a5bd46-bdd6-5e09-ca8d-5995d46f2ea8.png">
ユーザーの眼前まで描画範囲が狭まった。
描画コストは下がっただろうが、見える範囲が狭くゲームとして成り立たない。

## Farをもう少し遠くしてみる
- Near:0.01
- Far:3

<img width="600" alt="スクリーンショット 2019-10-14 15.23.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/036e0f1b-20e1-6375-9f71-9668da425485.png">
描画対象範囲が広がった。
ゲーム性によってはこの描画範囲で問題なさそう。

# 描画範囲外の見え方を調整する
## clear flagsの変更
clear flagsは、何のオブジェクトも描画していない範囲の描画をどのように更新するかの設定
### skybox
<img width="613" alt="スクリーンショット 2019-10-14 16.12.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/1852aad9-6fc6-3943-18e6-8ba2108b9164.png">

<img width="596" alt="スクリーンショット 2019-10-14 16.12.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/b09737e9-5687-5f14-264e-0c9e745416fa.png">

### solid color
単色塗り潰し
<img width="604" alt="スクリーンショット 2019-10-14 16.15.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/167161d7-92d5-1b84-4a88-4d1913910629.png">

<img width="592" alt="スクリーンショット 2019-10-14 16.15.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/da229b1a-1568-c8a8-43de-c46c80d5729d.png">
指定した色での塗り潰しになる。
凝った演出がない場合は、単色塗り潰し+フォッグでそれらしい見た目に出来る。

## Depth Only
複数台カメラがある場合の処理。
公式より。
> 例えばプレイヤーの銃を背景で隠れないように描画したい場合は、 1 台のカメラの Depth を 0 に設定して背景を描画し、もう 1 台のカメラの Depth は 1 に設定して武器のみを描画させます。武器を表示するカメラの Clear Flags は、Depth only に設定する必要があります。これにより、画面上の背景空間の表示は維持されますが、各オブジェクトが 3D 空間内でどこに存在するか、という情報はすべて破棄されます。銃が描画されるとき、銃がいくら壁に近くても、銃の不透明な部分が一番上に描画されます。

https://docs.unity3d.com/ja/2018.1/Manual/class-Camera.html

## Don't clear
背景の描画の更新を行わない。
更新を行わないので、予期せぬ表示になるため使うことは無さそう。
<img width="598" alt="スクリーンショット 2019-10-14 16.19.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/26e42e49-2963-7669-1289-a42083cdac83.png">

# フォグでそれらしい見た目になるように調整する
clear flagsをsolid colorにした上で、フォグを設定しそれらしい見た目になるようにする。
## フォグの設定方法
<img width="342" alt="スクリーンショット 2019-10-14 16.22.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/da568c53-7970-2ffd-9aea-b580d83da3c6.png">
Windows > Lightning > Settings > Ohter Settings
で設定できる。
<img width="387" alt="スクリーンショット 2019-10-14 16.24.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/b003081d-50d4-8c03-9755-4a6bdaaf530f.png">
### Color
フォグの色
### Mode
フォグのモードは3つある。
https://docs.unity3d.com/ja/2018.1/Manual/GlobalIllumination.html 
#### Linear
フォグの密度が距離に応じて直線的に増加する。
##### パラメータ
- Start:フォグの開始位置
- End:フォグの終了位置。この位置でフォグの密度が最大になる。
**Clipping PlanesのEndとフォグのEndを一致させる**のが良い。
表示終了位置でフォグの密度が最大になるので見え方が自然になる。

##### Startが0の場合
- Clipping PlanesのEnd:2
- Start:0
- End:2

<img width="600" alt="スクリーンショット 2019-10-14 16.31.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/3a864a68-bdae-13eb-65c8-00fd998de57e.png">
カメラの目の前からフォグが開始するため、全体が薄暗い印象になる。

##### Startが1.5の場合
- Clipping PlanesのEnd:2
- Start:1.5
- End:2

<img width="591" alt="スクリーンショット 2019-10-14 16.33.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/320dc08a-f714-ce8c-ed32-27542e5a8f5a.png">

Endから近い場所からフォグがスタートするので、手前は明るく、Clipping PlanesのEndに近い場所にフォグがかかるようになっている。

#### Exponential
フォグの密度が距離に応じて指数関数的に増加する。
#####パラメータ
- Density:フォグの密度。0-1で設定し、1になるほど最大のフォグが濃くなる。

##### Ensityが0.8の場合

<img width="598" alt="スクリーンショット 2019-10-14 16.37.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/82cf489a-13a0-08d6-1f14-96161bba99d3.png">
奥に行くほどフォグがより濃くなっていることが分かる。

#### Exponential Squared
Exponential同様に、フォグの密度が距離に応じて指数関数的に増加する。
Squared（二乗）されるので、距離に応じてより濃くなる。