几何变换_山峰隆起
2020-07-02 本文已影响0人
Rayson
1.基于屏幕变换过后的顶点变换
Shader "Unlit/V2f35"
{
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 a2v
{
float4 vertex : POSITION;
};
struct v2f {
float4 pos:POSITION;
float4 color:COLOR;
};
v2f vert(appdata_base v )
{
float2 xy = v.vertex.xz; //取得二维向量xz
float d = _R - length(xy); //计算模长
d= d<0 ? 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= UnityObjectToClipPos(uppos);
float x= o.pos.x / o.pos.w;
if(x > dis && x < dis + r)
o.color=fixed4(1,0,0,1);
else if(x>1)
o.color=fixed4(0,0,1,1);
else
o.color = fixed4(x/2+0.5,x/2+0.5,x/2+0.5,1);
return o;
}
fixed frag(v2f i):SV_TARGET
{
return i.color;
}
ENDCG
}
}
}
效果
2.让凸起来的部分(越高的颜色越白),需要基于新的顶点数据进行变换(模型空间)
Shader "Unlit/V2f35"
{
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 a2v
{
float4 vertex : POSITION;
};
struct v2f {
float4 pos:POSITION;
float4 color:COLOR;
};
v2f vert(appdata_base v )
{
float2 xy = v.vertex.xz; //取得二维向量xz
float d = _R - length(xy); //计算模长
d= d<0 ? 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= UnityObjectToClipPos(uppos);
// float x= o.pos.x / o.pos.w;
// if(x > dis && x < dis + r)
// o.color=fixed4(1,0,0,1);
// else if(x>1)
// o.color=fixed4(0,0,1,1);
// else
// o.color = fixed4(x/2+0.5,x/2+0.5,x/2+0.5,1);
o.color= fixed4(uppos.y, uppos.y, uppos.y ,1); //以高度作为颜色
return o;
}
fixed frag(v2f i):SV_TARGET
{
return i.color;
}
ENDCG
}
}
}
基于世界空间
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "Unlit/V2f35"
{
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 a2v
{
float4 vertex : POSITION;
};
struct v2f {
float4 pos:POSITION;
float4 color:COLOR;
};
v2f vert(appdata_base v )
{
float4 wpos =mul(unity_ObjectToWorld,v.vertex); //将模型空间装换成世界
float2 xy = wpos.xz; //取得二维向量xz
float d = _R - length(xy); //计算模长
d= d<0 ? 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= UnityObjectToClipPos(uppos);
// float x= o.pos.x / o.pos.w;
// if(x > dis && x < dis + r)
// o.color=fixed4(1,0,0,1);
// else if(x>1)
// o.color=fixed4(0,0,1,1);
// else
// o.color = fixed4(x/2+0.5,x/2+0.5,x/2+0.5,1);
o.color= fixed4(uppos.y, uppos.y, uppos.y ,1); //以高度作为颜色
return o;
}
fixed frag(v2f i):SV_TARGET
{
return i.color;
}
ENDCG
}
}
}
image.png
改变中心点
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "Unlit/V2f35"
{
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 a2v
{
float4 vertex : POSITION;
};
struct v2f {
float4 pos:POSITION;
float4 color:COLOR;
};
v2f vert(appdata_base v )
{
float4 wpos =mul(unity_ObjectToWorld,v.vertex); //将模型空间装换成世界
float2 xy = wpos.xz; //取得二维向量xz
float d = _R - length(xy - float2(_OX,0)); //计算模长 float2(_OX,0)为中心点到世界中心的距离
d= d<0 ? 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= UnityObjectToClipPos(uppos);
// float x= o.pos.x / o.pos.w;
// if(x > dis && x < dis + r)
// o.color=fixed4(1,0,0,1);
// else if(x>1)
// o.color=fixed4(0,0,1,1);
// else
// o.color = fixed4(x/2+0.5,x/2+0.5,x/2+0.5,1);
o.color= fixed4(uppos.y, uppos.y, uppos.y ,1); //以高度作为颜色
return o;
}
fixed frag(v2f i):SV_TARGET
{
return i.color;
}
ENDCG
}
}
}
image.png