主要参考:
下面的主要就是模拟Unity3D 中的Projector的效果。
CustomMainCamera 挂上 Main.cs,
projCamera属性就直接选择CustomProjectCamera gameobject
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class Main : MonoBehaviour {
public Camera projCamera;
public Matrix4x4 world2ProjView;
public Matrix4x4 cm;
void Start () {
projCamera.aspect = 1;
}
// Update is called once per frame
void Update () {
world2ProjView = projCamera.transform.worldToLocalMatrix;
cm = projCamera.projectionMatrix * projCamera.worldToCameraMatrix;
Shader.SetGlobalMatrix("projectM", cm);
}
}
CustomPlane,Sphere,Cylinder
挂上ProjectorShader.shader的材质
Shader "Unlit/ProjectorShader"
{
Properties {
_ProjTex ("Proj Tex", 2D) = "white" {}
}
SubShader {
Pass {
Tags { "RenderType"="Opaque" "LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform float4x4 projectM;
sampler2D _ProjTex;
struct VertexOutput{
float4 pos : POSITION;
float4 shadowUV : TEXCOORD2;
};
VertexOutput vert(appdata_base input)
{
VertexOutput o;
float4x4 modelMatrix = _Object2World;
o.pos = mul(UNITY_MATRIX_MVP,input.vertex);
o.shadowUV = mul(mul(projectM, modelMatrix), input.vertex);
o.shadowUV.xy = (o.shadowUV.xy + o.shadowUV.w) * 0.5;
return o;
}
float4 frag(VertexOutput input):COLOR
{
//float4 textureColor = tex2Dproj(_ProjTex, input.shadowUV);
// 下面两句与上面一句作用是一样的
input.shadowUV /= input.shadowUV.w;
float4 textureColor = tex2D(_ProjTex, input.shadowUV);
return textureColor;
}
ENDCG
}
}
FallBack "Diffuse"
}