在shader中,RGB为三原色组成的正方体。颜色范围为0~1.
要想实现渐变的效果,我们就需要颜色的值是连续并且一点一点变化的。
假设我们现在有一个小球,它的法向量我们可以知道都是唯一并且相邻法向量都是连续变化的,所以我们就可以将它的法向量直接当成颜色赋值上去,就可以实现渐变的效果。
我们知道,法向量的范围是[-1,1] ,但是我们的颜色是[0,1]因此我们就需要把它从[-1,1]转化为[0,1].
结构体appdata_base内容:
struct appdata_base {
float4 vertex : POSITION; //顶点坐标
float3 normal : NORMAL; //法线
float4 texcoord : TEXCOORD0; //第一纹理坐标
UNITY_VERTEX_INPUT_INSTANCE_ID //ID信息
}
这里面的vertex与POSITION的信息传递是双向的,即vertex为空时POSITION会传给它值,当vertex被修改了后也会把数据传给POSITION。
我们之前使用的“SV_POISITION”就是直接传回位置与法线信息,没有了SV_POISITION我们就需要手动去传回位置与法线信息,这也使得我们可以手动一对一的去修改位置与法线信息
完全代码如下
Shader "Custom/new5-2"
{
Properties{
//定义属性_Color
_Color("color",Color)=(1,1,1,1)
}
SubShader
{
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//引用Unity封装好的一些结构体
#include"UnityCG.cginc"
float4 _Color;//声明一下_Color
//引用appdata_base结构体
appdata_base vert(appdata_base v)//因为要传出去结构体v给片元着色器,所以用结构体定义顶点着色器vert
{
v.vertex=UnityObjectToClipPos(v.vertex);//将原本的坐标改为屏幕上显示的坐标
return v;
}
float4 frag(appdata_base v/*获取结构体v中的法线等信息*/):SV_TARGET
{
//-1 1 --> 0 1
float3 n = v.normal/2 + float3(0.5,0.5,0.5); //获取v的法线信息进行转化后并赋给n变量
//由于颜色是float4,为RGBA,我们有n作为RGB,仅缺少A.
return float4(n,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
然后我们完成一个小彩球(上面的_Color没有实际作用,可以删去,但注意也要把pass中的一并删去)