顶点位移Shader案例

💡 length(xy): 求向量模长度 等同于sqrt(x_x+y_y); 1、抬升地面

Shader "Custom/s_ten" {

 Properties{
 _R("R",range(0,5))=1
 }

 SubShader{
 pass {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #include "unitycg.cginc"

 float dis;
 float r;

 float _R;

 struct v2f {
 float4 pos:POSITION;
 fixed4 color : COLOR;
 };

 v2f vert(appdata_base v) {
//x、y坐标
 float2 xy = v.vertex.xz;
//求到圆心的距离,即半径
//float d = sqrt((xy.x - 0)*(xy.x - 0) + (xy.y-0)*(xy.y - 0));
//也可以使用下面的计算摸长的方式
 float d = _R - length(xy);
//d小于0则不抬升,否则抬升
 d = d < 0 ? 0 : d;
 float height=1;
 float4 uppos = float4(v.vertex.x,height*d,v.vertex.z,v.vertex.w);

 v2f o;
 o.pos = mul(UNITY_MATRIX_MVP, uppos);
//x的坐标值
 float x = o.pos.x / o.pos.w;

 if (x >dis && x<dis+r)//在屏幕最左边
 o.color = fixed4(1, 0, 0, 1);//显示为红色
 else
 o.color = fixed4(x/2+0.5,x/2+0.5,x/2+0.5,1);//灰度

 return o;
 }

 fixed4 frag(v2f IN) :COLOR{
 return IN.color;
 }
 ENDCG
 }
 }

}

https://img-blog.csdn.net/20180105174850732

https://img-blog.csdn.net/20180105174900577

https://img-blog.csdn.net/20180105174912179

https://img-blog.csdn.net/20180105174921991 通过更改R的值更改地表凸起的高度 https://img-blog.csdn.net/20180105175132656 2、实现雪山效果

Shader "Custom/s_ten" {

 Properties{
 _R("R",range(0,5))=1
 }

 SubShader{
 pass {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #include "unitycg.cginc"

 float dis;
 float r;

 float _R;

 struct v2f {
 float4 pos:POSITION;
 fixed4 color : COLOR;
 };

 v2f vert(appdata_base v) {
//x、y坐标
 float2 xy = v.vertex.xz;
//求到圆心的距离,即半径
//float d = sqrt((xy.x - 0)*(xy.x - 0) + (xy.y-0)*(xy.y - 0));
//也可以使用下面的计算摸长的方式
 float d = _R - length(xy);
//d小于0则不抬升,否则抬升
 d = d < 0 ? 0 : d;
 float height=1;
 float4 uppos = float4(v.vertex.x,height*d,v.vertex.z,v.vertex.w);

 v2f o;
 o.pos = mul(UNITY_MATRIX_MVP, uppos);
//x的坐标值
 float x = o.pos.x / o.pos.w;

 o.color = fixed4(uppos.y,uppos.y,uppos.y,1);

 return o;
 }

 fixed4 frag(v2f IN) :COLOR{
 return IN.color;
 }
 ENDCG
 }
 }

}

https://img-blog.csdn.net/20180105181107235 3、将坐标改为世界的,那么只有在一个模型上会有抬升,其它的模型都没有

Shader "Custom/s_ten" {

 Properties{
 _R("R",range(0,5))=1
 }

 SubShader{
 pass {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #include "unitycg.cginc"

 float dis;
 float r;

 float _R;

 struct v2f {
 float4 pos:POSITION;
 fixed4 color : COLOR;
 };

 v2f vert(appdata_base v) {
 float4 wpos = mul(_Object2World,v.vertex);

 float2 xy = wpos.xz;
 float d = _R - length(xy);

//d小于0则不抬升,否则抬升
 d = d < 0 ? 0 : d;
 float height=1;
 float4 uppos = float4(v.vertex.x,height*d,v.vertex.z,v.vertex.w);

 v2f o;
 o.pos = mul(UNITY_MATRIX_MVP, uppos);
//x的坐标值
 float x = o.pos.x / o.pos.w;

 o.color = fixed4(uppos.y,uppos.y,uppos.y,1);

 return o;
 }

 fixed4 frag(v2f IN) :COLOR{
 return IN.color;
 }
 ENDCG
 }
 }

}

https://img-blog.csdn.net/20180105182430804 4、改变顶点的位置信息

Shader "Custom/s_ten" {

 Properties{
 _R("R",range(0,5))=1
 _OX("OX",range(-5,5))=0
 }

 SubShader{
 pass {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #include "unitycg.cginc"

 float dis;
 float r;

 float _R;
 float _OX;

 struct v2f {
 float4 pos:POSITION;
 fixed4 color : COLOR;
 };

 v2f vert(appdata_base v) {
 float4 wpos = mul(_Object2World,v.vertex);

 float2 xy = wpos.xz;
 float d = _R - length(xy - float2(_OX,0));

//d小于0则不抬升,否则抬升
 d = d < 0 ? 0 : d;
 float height=1;
 float4 uppos = float4(v.vertex.x,height*d,v.vertex.z,v.vertex.w);

 v2f o;
 o.pos = mul(UNITY_MATRIX_MVP, uppos);
//x的坐标值
 float x = o.pos.x / o.pos.w;

 o.color = fixed4(uppos.y,uppos.y,uppos.y,1);

 return o;
 }

 fixed4 frag(v2f IN) :COLOR{
 return IN.color;
 }
 ENDCG
 }
 }

}

https://img-blog.csdn.net/20180105182828149

https://img-blog.csdn.net/20180105182905472

https://img-blog.csdn.net/20180105182937109