Panorama180 Render : Tips : 地面に影だけを落とす

Developer : ft-lab (Yutaka Yoshisaka).
03/27/2019 - 03/27/2019.

戻る

概要

Unity 2018.3.8で動作確認しました。
背景でVR180パノラマを指定したとき、3D形状を配置した場合に地面に影だけを落とします。
この処理はRendering PathをForwardにする必要があります。
また、影を落とす処理として「Dynamic Shadow Projector」(https://nyahoon.com/products/dynamic-shadow-projector )のアセットを使用しました。

手順

背景にVR180の写真を反映した場合に、円柱を配置します。
このときに地面に影を落とします。

CameraのRendering PathをForwardにする

CameraのInspector表示し、"Rendering Path"をForwardにします。

Depthのみを描画するShaderを用意

depthのみ描画するShaderとして「drawDepthOnly.shader」を以下のように記載します。
// This can be used when the Camera Rendering Path is Forward.
Shader "Custom/drawDepthOnly"
{
	Properties
	{
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
	}
	SubShader
	{
		Tags { "RenderType"="opaque" "Queue"="geometry" }
		LOD 200
		ZWrite On       // Allow writing of depth
		ColorMask 0     // Do not use RGBA
				
		CGPROGRAM
		#pragma surface surf Standard fullforwardshadows
		#pragma target 3.0
				
		sampler2D _MainTex;

		struct Input
		{
			float2 uv_MainTex;
		};
				
		half _Glossiness;
		half _Metallic;
		fixed4 _Color;
				
		void surf (Input IN, inout SurfaceOutputStandard o)
		{
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}
		

Depthのみを描画するMaterialを作成

ProjectウィンドウでMaterialを新規作成し、Shaderで"Custom/drawDepthOnly"を割り当てます。

Material名は"DepthOnlyMat"としました。

円柱形状と地面(Plane)を配置

3D形状として表示するCylinderをシーンに配置。
また、影を受ける地面として「Plane」を配置します。
このとき、地面の形状PlaneのMaterialとして、先ほど作成した"DepthOnlyMat"を割り当てます。

この状態でPlayすると、円柱は描画されますが地面のPlaneは描画されないことになります。
ここではまだ影は落ちていません。

地面(Plane)の"Cast Shadows"をOffにする

Planeを選択したとき表示されるInspectorウィンドウで、Mesh Rendererの"Cast Shadows"をOffにします。

この操作により、地面は他の形状に影を落とさなくなります。

"Dynamic Shadow Projector"をプロジェクトにインポート

Unity Asset Storeより、"Dynamic Shadow Projector"をシーンにインポートします。
以降は"Dynamic Shadow Projector"の手順になります。

Shadow Projectorを作成

シーンに"Create Empty"でGame Objectを配置します。名前を"Shadow Projector"に変更しました。

"Shadow Projector"のComponentとして"Draw Target Object"を検索して追加します。
Projector/Shadow Texture Renderer/Draw Target Objectが追加されました。

影を落とす形状をShadow Projectorに指定

影を落とす形状(ここではCylinder)をドラッグして、 Shadow Projectorの"Draw Target Object"Componentの"Target"にドロップします。

もし、複数形状の影を地面に落としたい場合は、EmptyのGameObject内に入れておくようにし、それを"Target"に割り当てます。

シャドウマップ用のMaterialを作成

マテリアルを作成し、"Shadow Projector"と名前変更します。
マテリアルのShaderとして"DynamicShadowProjector/Projector/Dynamic/MipmappedShadow"を割り当てます。

影の濃さなどは、"Shadow Projector"のInspectorで調整できます。

マテリアルを"Shadow Projector"に割り当て

"Shadow Projector"の"Projector"Componentの"Material"に、先ほど作成した "Shadow Projector"マテリアルを割り当てます。

シャドウマップのテクスチャサイズの調整

"Shadow Projector"の"Shadow Texture Renderer"Componentで、影用のテクスチャサイズを調整します。

"Shadow Projector"を移動/回転させ、影が落ちるように配置

"Shadow Projector"を移動/回転させて影が落ちるように配置します。
このとき、Directional Lightの向きと同じにするほうがよさそうです。

"Shadow Projector"のパラメータを調整

上記状態では、円柱部分にも影が落ちています。
これらの調整は、"Shadow Projector"の"Projector"で調整できます。
"Near Clip Plane"を大きくし、"Far Clip Plane"を影を落とす最小限の距離にしておきます。

また、"Field Of View"を70にしました。
"Orthographic"チェックボックスをOnにすると、スポットライト状の影を平行投影にできます。

以上の操作により、地面に影が落ちるようになりました。


これで、影の指定は完成です。

MainCameraに"Panorama180 Render"の割り当て

"Panorama180 Render"の割り当てを行います。
MainCameraに"Panorama180 Render"を割り当て、背景にVR180写真を割り当てました。

MainCameraの高さを調整

MainCameraのTransformで、PositionのYは実際に撮影したVR180写真での地面からの高さを指定するようにします。

これにより、地面のY=0の位置に影を受けるPlaneを配置することで、立体視の整合性を取ります。
出力したPanorama180 3D画像や動画で立体視に違和感がある場合は、このカメラの高さを確認するようにしてください。

Play

Playすると、以下のように出力されました。

地面に相当する箇所に円柱の影が落ちています。

戻る