1.声明Properties,并使用其值

Shader "Custom/vertex_shader" {
//必须位于SubShader之上
Properties{
 _MainColor("Main Color",color) = (1,1,1,1)
}

SubShader{
 pass {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag

 //必须将上面的Properties名称先进行声明,且名字必须与上面的一致
 float4 _MainColor;

 struct v2f {
 float4 pos:POSITION;
 float2 objPos:TEXCOORDO;
 float4 col:COLOR;
 };

 struct appdata_base {
 float2 pos:POSITION;
 float4 color:COLOR;
 };

 //使用结构体的方式返回,此时不需要再指定一个具体的语义
 //参数也使用结构体
 v2f vert(appdata_base v) {
 v2f o;
 o.pos = float4(v.pos, 0, 1);
 o.objPos = float2(1,0);
 //使用结构体默认的颜色
 o.col = v.color;
 return o;
 }

 //使用结构体进行输入
 float4 frag(v2f IN) :COLOR{
 //return IN.col;
 return _MainColor;
 }
 ENDCG
 }
 }
}

Uniform

💡 Uniform关键词,定义变量从自定义的应用程序当中获取值 声明方式:

uniform float4 _SecondColor;

完整代码:

Shader "Learning/VertexShader/vf2"
{
 Properties
 {
 _MainColor("MainColor",Color)=(1,1,1,1)
 }
 SubShader
 {
 pass{

 CGPROGRAM

 #pragma vertex vert

 #pragma fragment frag
 //引入sbin.cginc
 #include "sbin.cginc"

 float4 _MainColor;
 uniform float4 _SecondColor;


 typedef struct {
 float4 pos:POSITION;
 float2 objPos:TEXCOORD0;
 fixed4 col:COLOR;
 }v2f;


 v2f vert(appdata_base v)
 {
 v2f o;
 o.pos=float4(v.pos,0,1);
 o.objPos=float2(1,0);
 o.col=v.col;
 return o;
 }

 fixed4 frag(v2f IN):COLOR
 {

 return _MainColor*_SecondColor;
 }

 ENDCG 
 }
 }
}

Screenshot 2023-02-20 at 9.09.00 PM.png

💡 在上方的Shader当中,片元着色器最终输出的是_MainColor与_SecondColor相乘的结果 _MainColor在Properties中设置为白色,但是由于_SecondColor没有给其赋值,所以默认值为0,即相乘结果也为零,所以呈现黑色

给uniform赋值

1.编写脚本

using UnityEngine;

[ExecuteInEditMode]
public class Uniform : MonoBehaviour
{
 [SerializeField] Color secondColor;
 void Update(){
 GetComponent().material.SetVector("_SecondColor", secondColor);
 } 
}

2.绑定到被渲染物体上

Screenshot 2023-02-21 at 3.00.31 PM.png

效果

Screenshot 2023-02-21 at 3.00.46 PM.png

由于红色RGB值为(1,0,0),G和B值无论与任何数相乘都得0,所以使用呈现红色

修改片元着色器,颜色融合

fixed4 frag(v2f IN):COLOR
{
 return _MainColor*0.5+_SecondColor*0.5;
}

💡 两个颜色各乘0.5,再相加,颜色占比各取百分之五十,进行叠加 💡 同时可以调整相乘系数,来调整乘的权重值

Screenshot 2023-02-23 at 8.17.33 PM.png

Lerp插值函数

fixed4 frag(v2f IN):COLOR
{
 return lerp(_MainColor,_SecondColor,0.9);
}

💡 从_MainColor差值过度到_SecondColor, 0.9值其插值位置

Screenshot 2023-02-23 at 8.20.26 PM.png

💡 Uniform 关键字 默认也可以不用写,外部也可以写入数据