[Unity-Shader]Shader学习-彩球案例练习

在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中的一并删去)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值