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
}
}
}
💡 在上方的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.绑定到被渲染物体上
效果
由于红色RGB值为(1,0,0),G和B值无论与任何数相乘都得0,所以使用呈现红色
修改片元着色器,颜色融合
fixed4 frag(v2f IN):COLOR
{
return _MainColor*0.5+_SecondColor*0.5;
}
💡 两个颜色各乘0.5,再相加,颜色占比各取百分之五十,进行叠加 💡 同时可以调整相乘系数,来调整乘的权重值
Lerp插值函数
fixed4 frag(v2f IN):COLOR
{
return lerp(_MainColor,_SecondColor,0.9);
}
💡 从_MainColor差值过度到_SecondColor, 0.9值其插值位置
💡 Uniform 关键字 默认也可以不用写,外部也可以写入数据


...