假倒影

基本思路 
    多一个pass把某型转到想要的位置重绘一次,根据距离模型原点的位置改透明度
    倒影翻转了一个轴 导致面正反被翻转 剔除要改为前面剔除
   
效果
    
 
shader多的那个pass    
//倒影
Pass
{
	//倒影翻转了一个轴 导致面正反被翻转
	Cull Front

	CGPROGRAM
	#pragma vertex vert
	#pragma fragment frag
	#include "UnityCG.cginc"

	
	sampler2D _MainTex;
	float4 _MainTex_ST;

	fixed _AlphaScale;
	fixed4x4 _MT;

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

	struct v2f
	{
		float4 vertex : SV_POSITION;
		float2 baseuv : TEXCOORD0;
		float project : TEXCOORD1;
	};

	//计算某个点在某平面的法向量上的投影
	fixed Projection2PlaneNormal(fixed3 planePoint, fixed3 normal, fixed3 pos)
	{
		fixed3 dis = pos - planePoint;

		return dot(dis, normal);
	}
	
	v2f vert (appdata v)
	{
		v2f o;
		o.baseuv = TRANSFORM_TEX(v.uv, _MainTex);

		//坐标转换				
		float4 pos = mul(_MT, v.vertex);

		//局模型中心点距离 测试写死 这条鱼的投影在模型空间的x轴
        //或者是在世界坐标下计算可以不用考虑模型被旋转
		o.project = Projection2PlaneNormal(fixed3(0,0,0), fixed3(1,0,0), pos);

		o.vertex = mul(UNITY_MATRIX_MVP, pos);

		return o;
	}
	
	fixed4 frag (v2f i) : SV_Target
	{
		fixed3 baseCol = tex2D(_MainTex, i.baseuv);
		fixed alpha = 1 - saturate(i.project * _AlphaScale);
		return fixed4(baseCol, alpha);
	}
	ENDCG
}

坐标转换的矩阵有u3d函数简单生成 = =
Quaternion q = Quaternion.Euler(EulerAngle);
Matrix4x4 mt = Matrix4x4.TRS(posOffSet, q, Scale);

Renderer[] rds = GetComponentsInChildren<Renderer>();
for (int i = 0; i < rds.Length; ++i)
{
    for (int j = 0; j < rds[i].materials.Length; ++j)
    {
        rds[i].materials[j].SetMatrix("_MT", mt);
    }
}


posted @ 2017-08-30 17:02  Hichy  阅读(202)  评论(0编辑  收藏  举报