目录
课时33:VertexShader-几何变换-顶点颜色变换1
课时34:VertexShader-几何变换-顶点颜色变换2
课时33:VertexShader-几何变换-顶点颜色变换1
1.根据模型坐标设置颜色
v2f vert(appdata_base v)
{
v2f o;
if(v.vertex.x>0){
o.color=fixed4(1,0,0,1);
}
else{
o.color=fixed4(0,0,1,1);
}
o.pos=UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag(v2f IN):COLOR
{
return IN.color;
}
2.设置某一个顶点的颜色
if(v.vertex.x==0.5 && v.vertex.y==0.5 && v.vertex.z==-0.5){
o.color=fixed4(1,0,0,1);
}
else{
o.color=fixed4(0,0,1,1);
}
3.根据世界坐标设置颜色
float4 wpos=mul(unity_ObjectToWorld,v.vertex);
if(wpos.x>0){
o.color=fixed4(1,0,0,1);
}
else{
o.color=fixed4(0,0,1,1);
}
这里可以扩展成根据世界坐标中的一个平面的坐标来改变这个Shader里面的颜色变化的判断值。
和剖切有点像了
可以把颜色改成透明的吗
4.根据时间变化颜色
if(v.vertex.x==0.5 && v.vertex.y==0.5 && v.vertex.z==-0.5){
o.color=fixed4(_SinTime.w/2+0.5,_CosTime.w/2+0.5,_SinTime.y/2+0.5,1);
}
else{
o.color=fixed4(0,0,1,1);
}
---------------------------------------------------------------
课时34:VertexShader-几何变换-顶点颜色变换2
1.基于屏幕坐标设置颜色
o.pos=UnityObjectToClipPos(v.vertex);
float x=o.pos.x/o.pos.w;
if(x<=-1){
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);
}
Game和Scene分别渲染,结果不同。
2.坐标范围,光带
教程是用c#设置数据来运动的,我自己改成用_SinTime来运动
Shader "Custom/NewSurfaceShader2"
{
Properties{
_Dis("Dis",range(-1,1))=0
_Range("Range",range(0,2))=0.1
}
SubShader
{
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
struct v2f
{
float4 pos:POSITION;
fixed4 color:COLOR;
};
float _Dis;
float _Range;
v2f vert(appdata_base v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
float x=o.pos.x/o.pos.w;//-1,1
float offset=_SinTime.w;
bool b1=x>(_Dis+offset) && x<(_Dis+_Range+offset);
bool b2=x>(_Dis+offset+_Range*2) && x<(_Dis+_Range+offset+_Range*2);//两个光带
if(b1 || b2){
o.color=fixed4(x/2+0.5,0.5-x/2,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
}
}
}
--------------------------------------------------------------------------------
课时35:VertexShader-几何变换-顶点位移
1.雪山
Shader "Custom/NewSurfaceShader3"
{
Properties
{
_R("R",range(0,5))=1
}
SubShader
{
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
struct v2f
{
float4 pos:POSITION;
fixed4 color:COLOR;
};
float _R;
v2f vert(appdata_base v)
{
float2 xy=v.vertex.xz;
float d=_R-length(xy);//_R是最高值
d=d<0?0:d;//if(d<0)d=0;
float height=1;
float4 uppos=float4(v.vertex.x,height*d,v.vertex.z,v.vertex.w);
v2f o;
o.pos=UnityObjectToClipPos(uppos);
o.color=float4(uppos.y,uppos.y,uppos.y,1);
return o;
}
fixed4 frag(v2f IN):COLOR
{
return IN.color;
}
ENDCG
}
}
}
这个雪山只是一种渲染结果,顶点坐标实际没变换,无法在雪山上开车的。
2.世界坐标
float _R;
float _OX;
v2f vert(appdata_base v)
{
float4 wpos=mul(unity_ObjectToWorld,v.vertex);
//float2 xy=v.vertex.xz;
float2 xy=wpos.xz;
float d=_R-length(xy-float2(_OX,0));//_R是最高值
d=d<0?0:d;//if(d<0)d=0;
float height=1;
float4 uppos=float4(v.vertex.x,height*d,v.vertex.z,v.vertex.w);
v2f o;
o.pos=UnityObjectToClipPos(uppos);
o.color=float4(uppos.y,uppos.y,uppos.y,1);
return o;
}