UnityはRenderTextureを使用して、リアルタイムのシャドウ描画を実現します

序文

一般的に、リアルタイムの影は主にキャラクターやモンスターの足の裏に現れます。シーンをよりリアルにするために、これらの3つの方法は主に実装に使用されます。足の裏に影の画像を配置してメインを追跡します。キャラクター、描画、カメラのRenderRextureを介して表示し、直接使用します。UnityのProjectorコンポーネント。2Dシーンでは、便宜上、ゲームは通常、簡単な方法でクイックグレーの背景を配置します。達成される効果は少し現実的ではありませんが、それでも十分です。

ただし、3Dシーンで足の影を描きたい場合は、シャドウマップを直接配置することはできません。影の効果をよりリアルにするために、RenderTextureを使用したリアルタイムの影の描画の効果を紹介します。

基本的な考え方は、実際には追加のカメラを使用することです。カメラは、写真を撮る必要のある主人公のコンテンツを、人物よりも低い位置にある別のパッチに表示します。ミニマップの単純なバージョンのように見えます:主人公だけのミニマップ。

シーンに必要なオブジェクトを図に示します。RenderTexteureが表示されるマップノードでは、空のシェーダーが必要な限り、カメラによって照らされたコンテンツを提示する必要があります。PlaneオブジェクトまたはQuadオブジェクトを直接使用できます。

さらに、影をリアルにするために、影を表示するパッチは通常灰色で透明であり、個別に設定する必要があります。そうしないと、デフォルトのカメラで表示される文字が実際に表示される世界になります。

次に、マップパッチにコンテンツを書き込むようにカメラに指示するスクリプトが必要です。

シーンの表示ノードでスクリプトShadowScriptをバインドします。

public class ShadowScript : MonoBehaviour {
public GameObject display; //角色形象
private GameObject ShadowCamera;
private GameObject map;
private RenderTexture mTex = null; //即为显示阴影的RenderTexutre
public int AntiAliasing = 4;
Transform child;
// Use this for initialization
void Start () {
child = this.transform.FindChild(“qiangu1”);
map = child.FindChild(“child/map”).gameObject;
ShadowCamera = child.FindChild(“child/camera”).gameObject;
if (!display)
display = this.transform.parent.gameObject;
mTex = new RenderTexture(2000, 2000, 0);
mTex.name = “Shadow” + GetInstanceID();
Camera mCamera = ShadowCamera.GetComponent<Camera>();
mCamera.cullingMask = GetLayerMask(display.gameObject.layer);
mCamera.targetTexture = mTex;
}
public LayerMask GetLayerMask(int layer)
{
LayerMask mask = 0;
mask |= 1 << layer;
return mask;
}
// Update is called once per frame
void Update ()
{
if(display!=null)
{
mTex.anisoLevel = AntiAliasing;
}
map.renderer.maternTexture = mTex;
}
}

簡単ですよね?走るとリアルタイムの影の効果を直接見ることができます!

小骨モデル用の刀のアニメを作りました!ただ、しばらく見栄えの良い刀の模型が見つからなかったので、jpgの刀のバックルを探すのは大変でしたが、影の方が影の効果が良いことがわかります。独立したGameObjectには、多くの調整レベルが直接欠けています。問題は、主人公の影の効果しか表示されないことです。

しかし、刀の質感が配置されているパッチレイヤーを主人公モデルと同じになるように調整したところ、まだ刀の影が見えないことがわかりました。

このとき、マップ(シャドウを表示するパッチ)マテリアル専用のシェーダーも作成したため、デフォルトの透明/拡散は使用できず、剣の最終的な透明テクスチャは、新しく追加されたシェーダーであるUnlit/Transparentを使用する必要があります。次のような詳細なコード:

///作为带Alpha通道的模型贴图的shader
Shader “MyShader/AlphaSkinShader”
{
Properties
{
_Color(“Main Color”,Color)=(1,1,1,1)
_MainTex (“Base (RGB)”, 2D) = “white” {}
_Cutoff(“Base Alpha cutoff”,Range(0,0.9))=0.2
}
SubShader
{
Tags { “Queue”=“Transparent” }
LOD 200
Lighting Off
ZWrite Off
Cull off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include “UnityCG.cginc”
struct appdata_t
{
float4 vertex:POSITION;
float4 color:COLOR;
float2 texcoord:TEXCOORD;
};
struct v2f
{
float4 vertex:SV_POSITION;
float4 color:COLOR;
float2 texcoord:TEXCOORD;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _Cutoff;
v2f vert(appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP,v.vertex);
o.color=v.color;
o.texcoord=TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}
float4 _Color;
half4 frag(v2f i):SV_Target
{
half4 col = tex2D(_MainTex,i.texcoord);
if(col.a<_Cutoff)
{
clip(col.a-_Cutoff);
}
else
{
col.rgb=col.rgb*float3(0,0,0);
col.rgb=col.rgb+_Color;
col.a=_Color.a;
}
return col;
}
ENDCG
}
}
FallBack “Diffuse”
}

変更後の美しいランニング効果:

おすすめ

転載: blog.csdn.net/bycw666/article/details/123683522