//模型身上挂此脚本,实时渲染,
//模型身上使用shader--ScanTex2
using UnityEngine;
using EasyAR;
public class Coloring3DBehaviour : MonoBehaviour
{
Camera cam;
RenderTexture renderTexture;
ImageTargetBaseBehaviour targetBehaviour;
void Start()
{
targetBehaviour = GetComponentInParent<ImageTargetBaseBehaviour>();
gameObject.layer = 31;
}
void Renderprepare()
{
if (!cam)
{
GameObject go = new GameObject("__cam");
cam = go.AddComponent<Camera>();
go.transform.parent = transform.parent;
cam.hideFlags = HideFlags.HideAndDontSave;
}
cam.CopyFrom(Camera.main);
cam.depth = 0;
cam.cullingMask = 31;
if (!renderTexture)
{
renderTexture = new RenderTexture(Screen.width, Screen.height, -50);
}
cam.targetTexture = renderTexture;
cam.Render();
GetComponent<Renderer>().material.SetTexture("_MainTex", renderTexture);
}
void OnWillRenderObject()
{
if (!targetBehaviour || targetBehaviour.Target == null)
return;
Vector2 halfSize = targetBehaviour.Target.Size * 0.5f;
Vector3 targetAnglePoint1 = transform.parent.TransformPoint(new Vector3(-halfSize.x, 0, halfSize.y));
Vector3 targetAnglePoint2 = transform.parent.TransformPoint(new Vector3(-halfSize.x, 0, -halfSize.y));
Vector3 targetAnglePoint3 = transform.parent.TransformPoint(new Vector3(halfSize.x, 0, halfSize.y));
Vector3 targetAnglePoint4 = transform.parent.TransformPoint(new Vector3(halfSize.x, 0, -halfSize.y));
Renderprepare();
GetComponent<Renderer>().material.SetVector("_Uvpoint1", new Vector4(targetAnglePoint1.x, targetAnglePoint1.y, targetAnglePoint1.z, 1f));
GetComponent<Renderer>().material.SetVector("_Uvpoint2", new Vector4(targetAnglePoint2.x, targetAnglePoint2.y, targetAnglePoint2.z, 1f));
GetComponent<Renderer>().material.SetVector("_Uvpoint3", new Vector4(targetAnglePoint3.x, targetAnglePoint3.y, targetAnglePoint3.z, 1f));
GetComponent<Renderer>().material.SetVector("_Uvpoint4", new Vector4(targetAnglePoint4.x, targetAnglePoint4.y, targetAnglePoint4.z, 1f));
}
void OnDestroy()
{
if (renderTexture)
DestroyImmediate(renderTexture);
if (cam)
DestroyImmediate(cam.gameObject);
}
}
/////////////////////////////////////////////////////////////////////////////
Shader "Texture/ScanTex2" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Uvpoint1("point1", Vector) = (0 , 0 , 0 , 0)
_Uvpoint2("point2", Vector) = (0 , 0 , 0 , 0)
_Uvpoint3("point3", Vector) = (0 , 0 , 0 , 0)
_Uvpoint4("point4", Vector) = (0 , 0 , 0 , 0)
}
SubShader {
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
LOD 200
Pass{
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Uvpoint1;
float4 _Uvpoint2;
float4 _Uvpoint3;
float4 _Uvpoint4;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 fixedPos : TEXCOORD2;
} ;
v2f vert (appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
float4 top = lerp(_Uvpoint1, _Uvpoint3, o.uv.x);
float4 bottom = lerp(_Uvpoint2, _Uvpoint4, o.uv.x);
float4 fixedPos = lerp(bottom, top, o.uv.y);
o.fixedPos = ComputeScreenPos(mul(UNITY_MATRIX_VP, fixedPos));
return o;
}
float4 frag (v2f i) : COLOR
{
//float4 top = lerp(_Uvpoint1, _Uvpoint3, i.uv.x);
//float4 bottom = lerp(_Uvpoint2, _Uvpoint4, i.uv.x);
//float4 fixedPos = lerp(bottom, top, i.uv.y);
//fixedPos = ComputeScreenPos(mul(_VP, fixedPos));
//return tex2D(_MainTex, fixedPos.xy / fixedPos.w);
return tex2D(_MainTex, i.fixedPos.xy / i.fixedPos.w);
}
ENDCG
}
}
//FallBack "Diffuse"
}
网友评论