ShaderTips

シェーダーTips

主にUnityシェーダーについての記事を書いています。

【Unity】【URP】【物理カメラ】カメラについて解説

今回は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

視野角を設定します。

カメラはレンズが受け取った光をカメラセンサーに当たることで、写真を作ります。また、レンズからセンサーまでの距離を焦点距離と言います。焦点距離を変更すると、カメラセンサーに取り込む外光の範囲を変更できます。この範囲のことを視野角と言います。

物理カメラの使用 - Unity マニュアル参照

以下の二枚の画像は同じシーンに同じカメラを置き、視野角のみを変えています。 二枚目のように視野角を狭くすると映る範囲が狭くなり、画面に表示されているCubeが占める割合が大きくなっています。

fovに60(初期値)を設定

fovに30に設定

Clipping Planes

カメラのNearとFarを設定します。

Physical Camera

チェックを入れると物理カメラが有効になり、物理カメラの設定が表示されるようになります。

CameraBody

SensorType

センサータイプには実際に使用されている代表的なフィルムサイズがあり、設定したセンサータイプからSensor Sizeを自動で設定します。

SensorSize

カメラセンサーのサイズを設定します。

GateFit

センサーサイズで設定されたアスペクト比フィルムゲートと言います。

現在のスクリーンのアスペクト比解像度ゲートと言います。

GateFitではフィルムゲートと解像度ゲートが異なる際に整合させる基準を設定します。

物理カメラの使用 - Unity マニュアル引用

Vertical

フィルムゲートを解像度ゲートの高さ(Y軸)に合わせます。 センサーサイズの幅を変更しても、影響はありません。 フィルムゲートが解像度ゲートより大きい場合は、レンダリングされた画像の側面をトリミングします。

物理カメラの使用 - Unity マニュアル引用

フィルムゲートが解像度ゲートよりも小さい場合は、レンダリングされた画像の両側にオーバースキャンします。

物理カメラの使用 - Unity マニュアル引用

オーバースキャンは、テレビ画面に画像が収まらず、端が切れてしまう現象です。

https://support.apple.com/library/content/dam/edam/applecare/images/ja_JP/appletv/macos-high-sierra-desktop-overscan.jpg Mac、Apple TV、またはその他のディスプレイでのオーバースキャンとアンダースキャンについて - Apple サポート (日本)引用

Horizontal

フィルムゲートを解像度ゲートの幅 (X軸)に合わせます。 センサーサイズの高さを変更しても、影響はありません。 フィルムゲートが解像度ゲートより大きい場合は、レンダリングされた画像の上下にオーバースキャンします。

物理カメラの使用 - Unity マニュアル引用

フィルムゲートが解像度ゲートよりも小さい場合は、レンダリングされた画像の上下をトリミングします。

物理カメラの使用 - Unity マニュアル引用

Fill

フィルムゲートを解像度ゲートの短い方の軸に合わせます。

Overscan

フィルムゲートを解像度ゲートの長い方の軸に合わせます。

None

解像度ゲートをフィルムゲートの幅と高さ (X 軸と Y 軸) に合わせます。レンダリングされた画像をゲームビューのアスペクト比に合わせて伸縮させます。

物理カメラの使用 - Unity マニュアル引用

Lens

Focal Legth

焦点距離を設定します。

Shift

シフトレンズの設定を行います。

シフトレンズは、カメラのレンズをセンサーから水平方向と垂直方向にオフセットします。

例えば巨大なビルを地上から撮影する際にビル全体をカメラに収めようとするとカメラを上方向に向けます。 建物の側面に引いた2本の赤い線は本来、平行になるはずですが、カメラを傾けたため、上の方に行くほど収束するようになっています。

物理カメラの使用 - Unity マニュアル引用

この歪みを解消するために、シフトレンズを使用します。 カメラの向きを変える代わりにレンズを上に使用することで2本の直線を平行に保ったまま、撮影することができます。

物理カメラの使用 - Unity マニュアル引用

Rendering

Renderer

UniversalRenderPipelineアセットのRendererListに登録したScriptableRendererを継承したクラスを選択します。

PostProcessing

ポストエフェクトを有効にするか設定します。 デフォルトがオフなので、気をつけましょう。

Anti-aliasing

使用するアンチエイリアスを選択します。

アンチエイリアスに関してはこちらで解説しているのでよろしければどうぞ。

ny-program.hatenablog.com

Stop Nans

レンダーターゲットにNaNが入っている状態を回避するためにStopNaN.shaderというシェーダーを実行し、NaNのピクセルを黒(0,0,0)に置き換えます。

Dithering(ディザリング)

ディザリングを有効にするか設定します。

色はレンダーターゲットに書き込まれる際に浮動小数点数から0 ~ 255 の整数に変換されます。このとき、誤差が切り捨てられるので、色がグラデーションしている部分が縞模様になってしまいます。 この現象をカラーバンディングと言います。

以下の画像の真ん中の大きなCubeをよく見ると縞模様になっています。

Dithering - Unity マニュアル引用

これを解消するためにランダムで色を増減させます。 以下の画像はディザリングを行なった状態ですが、先程の縞模様が解消されているのが分かります。

Dithering - Unity マニュアル引用

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