假倒影
基本思路
多一个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);
}
}