1、顶点颜色变换
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/s_nine" {
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float4x4 mvp;
float4x4 rm;
float4x4 sm;
struct v2f {
float4 pos:POSITION;
fixed4 color : COLOR;
};
v2f vert(appdata_base v) {
v2f o;
float4x4 m = mul(sm, UNITY_MATRIX_MVP);
o.pos = mul(m,v.vertex);
if (float(v.vertex.x) > 0)
o.color = fixed4(1, 0, 0, 1);//显示为红色
else
o.color = fixed4(0,0,1,1);//显示为蓝色
return o;
}
fixed4 frag(v2f IN) :COLOR{
return IN.color;
}
ENDCG
}
}
}
运行结果:中间颜色自动渐变
2、改变某个顶点的颜色值
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/s_nine" {
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float4x4 mvp;
float4x4 rm;
float4x4 sm;
struct v2f {
float4 pos:POSITION;
fixed4 color : COLOR;
};
v2f vert(appdata_base v) {
v2f o;
float4x4 m = mul(sm, UNITY_MATRIX_MVP);
o.pos = mul(m,v.vertex);
if (float(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);//显示为蓝色
return o;
}
fixed4 frag(v2f IN) :COLOR{
return IN.color;
}
ENDCG
}
}
}
3、 在不同的位置,颜色不一样
4、加上时间因子后,颜色的变化
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/s_nine" {
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float4x4 mvp;
float4x4 rm;
float4x4 sm;
struct v2f {
float4 pos:POSITION;
fixed4 color : COLOR;
};
v2f vert(appdata_base v) {
v2f o;
float4x4 m = mul(sm, UNITY_MATRIX_MVP);
o.pos = mul(m,v.vertex);
if (float(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);//显示为蓝色
return o;
}
fixed4 frag(v2f IN) :COLOR{
return IN.color;
}
ENDCG
}
}
}
1、在最左边是一个颜色值,在最右边又是另一个颜色值
Shader "Custom/s_ten" {
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float4x4 mvp;
float4x4 rm;
float4x4 sm;
struct v2f {
float4 pos:POSITION;
fixed4 color : COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//x的坐标值
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);
return o;
}
fixed4 frag(v2f IN) :COLOR{
return IN.color;
}
ENDCG
}
}
}
在屏幕最左端时显示为一个颜色
多拷贝几个cube,可以看到灰度变化
2、使用plane,显示颜色变换光带
3、灰度在某个区间之内显示一条光带,在区间之外显示灰度
Shader "Custom/s_ten" {
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float4x4 mvp;
float4x4 rm;
float4x4 sm;
struct v2f {
float4 pos:POSITION;
fixed4 color : COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//x的坐标值
float x = o.pos.x / o.pos.w;
if (x >0 && x<0.1)//在屏幕最左边
o.color = fixed4(1, 0, 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
}
}
}
4、随时间推移而变换的光带
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SetFloat : MonoBehaviour {
private float dis =-1;
private float r = 0.1f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
dis += Time.deltaTime*0.1f;
GetComponent().material.SetFloat("dis", dis);
GetComponent().material.SetFloat("r", r);
}
}
Shader "Custom/s_ten" {
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float dis;
float r;
struct v2f {
float4 pos:POSITION;
fixed4 color : COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//x的坐标值
float x = o.pos.x / o.pos.w;
if (x >dis && x<dis+r)//在屏幕最左边
o.color = fixed4(1, 0, 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
}
}
}


...