shader效果中存在“缝隙”:(最后的代码中已经注释的很清楚了)
出现缝隙的原因:因为UV坐标是不连续的,所以会有缝隙。。。(法线的T,B,是根据U和V生成的,所以用法线也会有裂缝,这里的法线和下面用作mask的用法是不一样的)
三平面映射的效果:图中的边界是有过渡和缓冲,如下图
基本展示:
世界空间XY平面效果:
世界空间XZ展示:
存在的问题(不可避免的问题):!!!!!!!!!
宏观思路 :
(1)
(2)法线遮罩效果 和 思路:
(3)
换成noise图看不出缝隙!!!!
Shader "Unlit/TriPlanar_Code"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Tilling("Main Tilling",Vector) = (1,1,1,1)
_Contrast("Contrast",Range(1,10)) = 5
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 worldPos : TEXCOORD01;
float3 worldPivot : TEXCOORD02;
float3 worldNormal : TEXCOORD03;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Tilling;
float _Contrast;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.worldPivot = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;
o.worldNormal = UnityObjectToWorldNormal(v.normal);
return o;
}
// 根据法线的 三个轴 , 生成遮罩
float3 NormalMask(float3 wNormal)
{
float3 tempNormal = pow(abs(wNormal),_Contrast);
float3 mask = tempNormal /(tempNormal.x + tempNormal.y + tempNormal.z);
return mask;
}
float4 TriPlanar(float3 maskValue,float3 worldPos,float3 worldPivot)
{
float3 tempPos = ((worldPos - worldPivot) * _Tilling.xyz).xyz;
// xy 平面的像素正常显示 但是 其他轴对应平面的值不正确,所以 乘以 maskValue.z,屏蔽掉其它轴面的值。
float4 colorZ = tex2D(_MainTex,tempPos.xy) * maskValue.z;
float4 colorY = tex2D(_MainTex,tempPos.xz) * maskValue.y;
float4 colorX = tex2D(_MainTex,tempPos.yz) * maskValue.x;
// 三个轴面的正确结果相加 , 归一化
return normalize(colorX + colorY + colorZ);
}
fixed4 frag (v2f i) : SV_Target
{
float3 maskValue = NormalMask(i.worldNormal);
float4 triColor = TriPlanar(maskValue,i.worldPos,i.worldPivot);
return triColor;
}
ENDCG
}
}
}
通过 在3DMax中的 ”顶点色“ 来控制顶点的运动幅度。。。
顶点动画在播放 但是 眼睛不要动, 骨头的根部不要动。