美文网首页
EaayAR2.1涂涂乐1

EaayAR2.1涂涂乐1

作者: 萧非子 | 来源:发表于2017-11-24 15:37 被阅读24次

//模型身上挂此脚本,实时渲染,
//模型身上使用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"

}

相关文章

网友评论

      本文标题:EaayAR2.1涂涂乐1

      本文链接:https://www.haomeiwen.com/subject/egitbxtx.html