はじめに
なぜいきなりカメラを調べたかって言うとこんなバグにぶつかったから。
残像いっぱい |
結局簡単に直せたんですが意味不明すぎて気持ち悪かったので調べました。
いきなりまとめ
ちょっと今日の記事はだらだらと長くなりそうなので結論だけ先に書いときますね。
素人のたどり着いた結論なので詳しい人が見たら間違ってるかも…。
素人のたどり着いた結論なので詳しい人が見たら間違ってるかも…。
複数カメラを使うときに知っておくこと
- 深度(Depth)の浅いカメラから順に描画される
- 各カメラの背景はクリアフラグ(Clear Flags)に従って塗りつぶされる
クリアフラグについて
- Skybox
カメラごとに設定されたSkybox(空模様マテリアル)で塗りつぶされる
カメラにSkyboxが設定されていない場合、既定のSkyboxで塗りつぶされる
既定のSkyboxも設定されていない場合、Backgroundに指定した色で塗りつぶされる - Solid Color
Backgroundに指定した色で塗りつぶされる。 - Depth only
より深度の浅いカメラに任せる?このカメラでは塗りつぶさないよ的な…。 - Don't Clear
コレわかんない。
では色々やってみたこと載せときます。
カメラの深度について
とりあえず見てみましょー。
新規Sceneを作成し、下記オブジェクトを配置します。
・Main camera(最初からあるやつ)
・座標(0,0,-10)
・その他全てデフォ
・Hierarchy->Create->Cube
・座標(0,0,0)
・サイズ(1,1,1)
・Hierarchy->Create->Directional light
置くだけ。
・Hierarchy->Create->Camera
・名前をSubCameraに
・座標(5,2,-5)
・回転(0,-45,0)
・Clear Flagsを"Skybox"に
・Depthは0
SubCameraから見たCube |
SubCameraから見た(斜めから見た)Cubeが表示されましたね。
今はMainCameraのDepthが-1、SubCameraのDepthが0なので描画順は
①MainCameraのCube
②MainCameraの背景塗りつぶし
③SubCameraのCube
④SubCameraの背景塗りつぶし
なんだと思います。MainCamera無意味ですね。
ここでMainCameraのDepthを1にすると…
MainCameraから見たCubeに変わりましたね。
描画順が入れ替わりました。
Depthの小さいものから描画されて、Depthの大きいものが手前に表示される。
たぶんこんな感じ。カメラ深度終わり。かんたんですね。
でもこれじゃ複数カメラ置いた意味がないですよね。
ゲーム画面用カメラとGUI用カメラとか同時に描画したい。
それを可能にするのがクリアフラグ(きっとそうだと信じたい
その状態でSubCameraのClearFlagsをDepthOnlyにしてみましょう。
2つのカメラから見たCubeがどちらも表示されました。
MainCameraから見たCube |
描画順が入れ替わりました。
Depthの小さいものから描画されて、Depthの大きいものが手前に表示される。
たぶんこんな感じ。カメラ深度終わり。かんたんですね。
でもこれじゃ複数カメラ置いた意味がないですよね。
ゲーム画面用カメラとGUI用カメラとか同時に描画したい。
それを可能にするのがクリアフラグ(きっとそうだと信じたい
クリアフラグについて
冒頭にも書きましたがクリアフラグは4種類から選べます。
クリアフラグ - Depth only
まずMainCameraのDepthを-1に戻しておきましょう。その状態でSubCameraのClearFlagsをDepthOnlyにしてみましょう。
両カメラから見たCube |
①MainCameraのCube
②MainCameraの背景塗りつぶし
③SubCameraのCube
④SubCameraの背景塗りつぶさない(DepthOnly)
こんな感じかな?
クリアフラグをDepthOnlyにするとそのカメラの描画しない部分が塗りつぶされなくなります。
より深度の浅いカメラ任せってことですね。
クリアフラグ - Skybox
Skyboxを使うと簡単に空とか背景っぽいものを表示できます。カメラごとに指定することもできるし、既定の設定として指定することもできます。
背景塗りつぶしのの優先度は
(優先度高) > CameraのSkybox > 既定のSkybox > Background > (優先度低)
みたいです。
MainCameraにSkyboxを設定して確認してみましょう。
カメラにSkyboxを指定
・Assets->Import Package->Skyboxes標準Skyboxをインポート |
インポート |
・MainCameraのSkyboxComponentにImportしたSkyboxMaterialをドラッグ
CameraにSkyboxを設定 |
晴れた空の背景が映りました。
既定のSkyboxを指定
カメラごとにSkyboxを設定しなくてもプロジェクト既定のSkyboxを指定することができます。
・Edit->RenderSettingのSkyboxMaterialに指定できます。
既定のSkybox |
クリアフラグ - Solid Color
これはもう名前の通りですね。
Backgroundに指定した色で塗りつぶされます。
Skyboxを選択しててもMaterialが指定されていないとこの動作になります。
Solid Colorで塗りつぶし |
クリアフラグ - Don't Clear
これが全然分からなかった。いろいろ触ったけどどういう変化が起きるのか分かりませんでした。
マニュアルでもあまり使わないって書いてあるし別にいいかな。
まとめ
これで結構カメラについての知識が深まりました。少なくとも複数カメラへの恐怖は無くなったかなw
最初の不具合もすっきり!
カメラ1つでDepthOnlyになってたからうまく背景をクリアできてなかったんですね。
よかったよかった。
→Unity系記事まとめ