任意門效果

這是一個模擬機器貓裏面的任意門的顯示效果,即通過門可以看到千里之外的地方,而門邊緣以外的地方則仍然是眼前的場景,廢話不說,先上效果圖:


這裏就不講一個個製作的步驟了,主要講一下原理以及相應的代碼實現吧,理解了原理就很容易做出來了。

其實就是用一個保持與主相機一致的附屬相機觀察另一個場景,將畫面輸出都一個rendertexture中,然後把這個觀察出來的紋理實時繪製到門上。難點就在於紋理的映射上,如何能夠準確的把照相機紋理映射到門框,沒有任何贅餘。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class main : MonoBehaviour {
	public Camera m_cam;
	public Material m_mat;
	// Use this for initialization
	void Start () {
		m_mat.SetMatrix ("_WorldToCameraMatrix", m_cam.worldToCameraMatrix);
		m_mat.SetMatrix ("_ProjectionMatrix", m_cam.projectionMatrix);
	}
	
	// Update is called once per frame
	void Update () {
		m_mat.SetMatrix ("_WorldToCameraMatrix", m_cam.worldToCameraMatrix);
		m_mat.SetMatrix ("_ProjectionMatrix", m_cam.projectionMatrix);
	}
}
以上代碼把觀察遠處場景的照相機(以下稱爲相機b)的投影矩陣以及世界轉相機矩陣傳入了下方的着色器中:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Hidden/Door"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}
	}
		SubShader
	{
		Tags
	{
		"Queue" = "Transparent+100"
	}
	zwrite off
		Pass
	{
		Blend SrcAlpha OneMinusSrcAlpha
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"
		uniform float4x4 _WorldToCameraMatrix;
		uniform float4x4 _ProjectionMatrix;

		struct appdata
		{
			float4 vertex : POSITION;
			float2 uv : TEXCOORD0;
		};

		struct v2f
		{
			float2 uv : TEXCOORD0;
			float4 vertex : SV_POSITION;
		};

		v2f vert(appdata v)
		{
			v2f o;
			o.vertex = UnityObjectToClipPos(v.vertex);

			float4 worldCoord = mul(unity_ObjectToWorld, v.vertex);
			float4 cameraCoord = mul(_WorldToCameraMatrix, worldCoord);
			float4 projectionCoord = mul(_ProjectionMatrix, cameraCoord);
			o.uv = projectionCoord / projectionCoord.w;
			o.uv = 0.5f*o.uv + float2(0.5f, 0.5f);
			return o;
		}

		sampler2D _MainTex;

		fixed4 frag(v2f i) : SV_Target
		{
			float dis = (i.uv.x - 0.5f)*(i.uv.x - 0.5f) + (i.uv.y - 0.5f)*(i.uv.y - 0.5f);
			fixed4 col = tex2D(_MainTex, i.uv);
			return col;
		}
			ENDCG
		}
	}
}

上面shader代碼做的就是把模型(門)在相機b中的投影和相機的拍攝的紋理座標相互對應。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章