今回はURPのカメラについて解説していきます。
UniversalAdditionalCameraDataコンポーネント
URPにはCameraコンポーネントをつけると自動でUniversal Additional CameraDataというコンポーネントが追加されます。 このコンポーネントはURPで拡張された機能に関するデータを管理します。 それらのパラメータはCameraコンポーネントのインスペクタ に表示されており、UniversalAdditionalCameraDataコンポーネントのインスペクタには何も表示されません。
このコンポーネントはカメラから以下のインスタンスで取得できます。
var cameraData = camera.GetUniversalAdditionalCameraData();
詳しくはリファレンスでご確認ください。 docs.unity3d.com
Camera コンポーネント
RenderType
BaseカメラかOverlayカメラかを選択します。 これはカメラスタックという複数のカメラをレンダリングする機能の設定です。 Baseカメラの描画が初めに行われ、その後にOverlayカメラの描画が行われます。 詳しい解説は後ほどカメラスタックの設定があるのでそこで説明します。
Projection
Projection
投影手法の設定を行います。 透視投影(Perspective)か平行投影(Orthographic)を選択します。
FieldofViewAxis
次に説明するFieldofViewパラメータに設定される値を、スクリーンの垂直方向(Vertical)か水平方向(Horizontal)で設定します。
FieldofView
視野角を設定します。
カメラはレンズが受け取った光をカメラセンサーに当たることで、写真を作ります。また、レンズからセンサーまでの距離を焦点距離と言います。焦点距離を変更すると、カメラセンサーに取り込む外光の範囲を変更できます。この範囲のことを視野角と言います。
以下の二枚の画像は同じシーンに同じカメラを置き、視野角のみを変えています。 二枚目のように視野角を狭くすると映る範囲が狭くなり、画面に表示されているCubeが占める割合が大きくなっています。
fovに60(初期値)を設定
fovに30に設定
Clipping Planes
カメラのNearとFarを設定します。
Physical Camera
チェックを入れると物理カメラが有効になり、物理カメラの設定が表示されるようになります。
CameraBody
SensorType
センサータイプには実際に使用されている代表的なフィルムサイズがあり、設定したセンサータイプからSensor Sizeを自動で設定します。
SensorSize
カメラセンサーのサイズを設定します。
GateFit
センサーサイズで設定されたアスペクト比をフィルムゲートと言います。
現在のスクリーンのアスペクト比を解像度ゲートと言います。
GateFitではフィルムゲートと解像度ゲートが異なる際に整合させる基準を設定します。
Vertical
フィルムゲートを解像度ゲートの高さ(Y軸)に合わせます。 センサーサイズの幅を変更しても、影響はありません。 フィルムゲートが解像度ゲートより大きい場合は、レンダリングされた画像の側面をトリミングします。
フィルムゲートが解像度ゲートよりも小さい場合は、レンダリングされた画像の両側にオーバースキャンします。
オーバースキャンは、テレビ画面に画像が収まらず、端が切れてしまう現象です。
Mac、Apple TV、またはその他のディスプレイでのオーバースキャンとアンダースキャンについて - Apple サポート (日本)引用
Horizontal
フィルムゲートを解像度ゲートの幅 (X軸)に合わせます。 センサーサイズの高さを変更しても、影響はありません。 フィルムゲートが解像度ゲートより大きい場合は、レンダリングされた画像の上下にオーバースキャンします。
フィルムゲートが解像度ゲートよりも小さい場合は、レンダリングされた画像の上下をトリミングします。
Fill
フィルムゲートを解像度ゲートの短い方の軸に合わせます。
Overscan
フィルムゲートを解像度ゲートの長い方の軸に合わせます。
None
解像度ゲートをフィルムゲートの幅と高さ (X 軸と Y 軸) に合わせます。レンダリングされた画像をゲームビューのアスペクト比に合わせて伸縮させます。
Lens
Focal Legth
焦点距離を設定します。
Shift
シフトレンズの設定を行います。
シフトレンズは、カメラのレンズをセンサーから水平方向と垂直方向にオフセットします。
例えば巨大なビルを地上から撮影する際にビル全体をカメラに収めようとするとカメラを上方向に向けます。 建物の側面に引いた2本の赤い線は本来、平行になるはずですが、カメラを傾けたため、上の方に行くほど収束するようになっています。
この歪みを解消するために、シフトレンズを使用します。 カメラの向きを変える代わりにレンズを上に使用することで2本の直線を平行に保ったまま、撮影することができます。
Rendering
Renderer
UniversalRenderPipelineアセットのRendererListに登録したScriptableRendererを継承したクラスを選択します。
PostProcessing
ポストエフェクトを有効にするか設定します。 デフォルトがオフなので、気をつけましょう。
Anti-aliasing
使用するアンチエイリアスを選択します。
アンチエイリアスに関してはこちらで解説しているのでよろしければどうぞ。
Stop Nans
レンダーターゲットにNaNが入っている状態を回避するためにStopNaN.shaderというシェーダーを実行し、NaNのピクセルを黒(0,0,0)に置き換えます。
Dithering(ディザリング)
ディザリングを有効にするか設定します。
色はレンダーターゲットに書き込まれる際に浮動小数点数から0 ~ 255 の整数に変換されます。このとき、誤差が切り捨てられるので、色がグラデーションしている部分が縞模様になってしまいます。 この現象をカラーバンディングと言います。
以下の画像の真ん中の大きなCubeをよく見ると縞模様になっています。
これを解消するためにランダムで色を増減させます。 以下の画像はディザリングを行なった状態ですが、先程の縞模様が解消されているのが分かります。
Render Shadows
シャドウをレンダリングするか設定します。
Priority
シーン内に配置されたBaseカメラが複数ある場合、描画順の優先度を設定します。 値が小さい方から順に描画されます。
OpaqueTexture
不透明オブジェクト群とスカイボックスが描画された時点でのテンポラリーなテクスチャを作成します。 このテクスチャは_CameraOpaqueTextureという名前で、グローバルテクスチャ変数として定義されます。
UsePipleneSettingsに設定した場合はUniversalRenderPipelineAssetの設定値を使用します。
DepthTexture
OpaqueTextureのデプス版です。 _CameraDepthTextureというグローバルテクスチャ変数に深度バッファが書き込まれます。
CullingMask
このカメラが描画するオブジェクトをレイヤーで指定します。
OcclusionCulling
オクルージョンカリングを有効にするか設定します。
Stack
シーン内に配置されたOverlayカメラをカメラスタックに追加できます。
RenderTypeで前述した通り、カメラはBaseカメラとOverlayカメラの2種類あり、これは複数のカメラを描画するための設定します。 カメラスタックは複数のカメラをグループ化する機能で、1個のBaseカメラと0個以上のOverlayカメラで構成されます。
レンダリング実行時には、Baseカメラを描画後、Stackに追加された順にOverlayカメラを描画します。
Enviroment
BackgroundType
カメラスタックの描画終了時にレンダリングされていなかったピクセルの扱いを設定します。
Volumes
ここからはVolume Frameworkに関する設定です。 Volume Frameworkはポストエフェクトで使用するパラメーターを管理するためのフレームワークです。 Volumeというポストエフェクトとコリジョンなどの情報を持つコンポーネントがあり、GlobalVolumeとLocalVolumeの2つあります。 LocalVolumeは設定したコリジョンにカメラがヒットした際にポストエフェクトが反映されるのに対し、GlobalVolumeは必ず反映されます。
UpdateMode
VolumeStack クラスインスタンス の更新を毎フレーム要求するかどうかを設定します。
VolumeMask
このカメラに適用するVolumeコンポーネントが所属するレイヤーを管理します。
VolumeTrigger
LocalVolumeのコライダーとヒットしているか判定するためのTransformを設定します。未設定時の場合カメラコンポーネントがついているオブジェクトのTransformを使用します。
Output
OutputTexture
描画先のレンダーテクスチャを設定します。 設定した場合、カメラターゲットには描画されません。
TargetDisplay
マルチディスプレイで描画する際にこのカメラが描画するディスプレイを設定します。
マルチディスプレイについてはリファレンスをご確認ください。 docs.unity3d.com
Target Eye
VRの時、このカメラで右目か左目どちらにレンダリングを行うか設定します。
ViewportRect
カメラがレンダリングするスクリーンの範囲を設定します。 スクリーンの範囲は左下が [0,0]、右上が[1,1]です。
HDR
カメラスタックごとのHDRの有効無効を設定します。 Offの時は常にLDRで処理されます。 Use Pipeline Settingsの時はUniversalRenderPipelineAssetアセットのHDRパラメータを参照します。
HDRはこちらの記事で解説しています。 ny-program.hatenablog.com
MSAA
カメラスタックごとのMSAAの有効無効を設定します。 Offの時はMSAAを適用しません。 Use Pipeline Settingsの時はUniversalRenderPipelineAssetアセットのAnti-Ailiathing ( MSAA ) パラメータ( 下 図 )
AllowDynamicResolution
動的解像度と言って、個々のレンダーターゲットを動的にスケーリングし、GPU の負荷を軽減できるカメラ設定です。
動的解像度についてはリファレンスをご確認ください。 docs.unity3d.com
参考
docs.unity3d.com note.com note.com docs.unity3d.com developers.wonderpla.net www.youtube.com