Panorama180 Render : Tips : 地面に影だけを落とす
Developer : ft-lab (Yutaka Yoshisaka).
03/27/2019 - 03/27/2019.
概要
手順
背景に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"をプロジェクトにインポート
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すると、以下のように出力されました。
地面に相当する箇所に円柱の影が落ちています。