// 创建Shader 用ShaderLab写骨骼
Shader "Zhongdudu/Text"
{
// Shader的外部属性(在面板上可以调节)
Properties
{
//格式 属性名(面板显示名,类型)=初始值 在这里不能写分号,会报错
//浮点数
_FloatValue("FloatValue",Float)=0.4
//范围浮点数
_FloatRange("FloatRange",Range(0.1,1))=0.7
//四维数
_VectorValue("VectorValue",Vector)=(1,2,3,4)
//颜色
_Color("Color",Color)=(1,0,0,1)
//2阶贴图
_Texture2D("MainTexture",2D)=""{}
//非2阶贴图
_Rect("RectValue",Rect)=""{}
//立方体贴图
_Cube("Cube",Cube)=""{}
}
// 一个SubShader就是一个渲染方案
// 先执行第一个SubShader,根据性能来判断是否执行下一个SubShader,SubSHader的数量根据需求而定
// 效果最好,但性能消耗最大
SubShader
{
// 每个SubShader必须包含至少一个Pass通道,表面着色器除外
Pass
{
}
}
// 效果最差,但性能消耗最小
SubShader
{
Pass
{
}
}
// 当前方的所有SubShader都无法执行,才会执行这个
Fallback "Diffuse"
}
渲染的先后顺序
Shader "Zhongdudu/Five"
{
Properties
{
}
SubShader
{
//标签
Tags
{
// "Key"="Value"
// Background后台 1000 Geometry⼏何体 2000 Transparent透明 3000 Overlay覆盖 4000
// 值越小越先渲染,值越大的越不会被其他物体遮挡
"Queue"="Background+1"
}
//关闭深度测试
ZText Off
Pass
{
}
}
Fallback "Diffuse"
}
Shader "Zhongdudu/One"
{
Properties
{
_DiffuseColor("漫反射颜色",Color)=(1,0,0,1)
_AmbientColor("环境光反射颜色",Color)=(1,0,0,1)
_SpecularColor("⾼光颜色",Color)=(1,0,0,1)
_EmissionColor("⾃发光颜色",Color)=(1,0,0,1)
_Float("光泽度",Range(0.1,100))=0.7
}
SubShader
{
// Color 颜色
Pass
{
// 固定渲染一个颜色,在( )中直接赋值
Color(1,0,0,1)
// 使用变量控制颜色,记得使用 [ ]
Color[_Color]
}
// Material
Pass
{
// 开启/关闭顶点光照 On/Off
Lighting On
// 开启/关闭镜⾯反射 On/Off
SeparateSpecular On
// 在写漫反射/环境光反射颜⾊/光泽度/⾼光颜⾊/⾃发光颜⾊等功能时需要写该命令
Material
{
// 漫反射
Diffuse[_DiffuseColor]
//环境光反射颜⾊
Ambient[_AmbientColor]
//光泽度
Shininess[_Float]
//⾼光颜⾊
Specular[_SpecularColor]
//⾃发光颜⾊
Emission[_EmissionColor]
}
}
}
Fallback "Diffuse"
}
哪一面显示,哪一面不显示
例如:
SubShader
{
Pass
{
// 剔除背面 显示正面
Cull Back
}
Pass
{
// 剔除正面 显示背面
Cull Front
}
Pass
{
// 正反两面都显示
Cull Off
}
}
深度就是根据顶点和像素距离摄像机的距离
Shader "Zhongdudu/Three"
{
Properties
{
_Mask("遮挡时的颜色",Color)=(0,1,0,1)
_Noocclusion("没被遮挡时的颜色",Color)=(1,0,1,1)
}
SubShader
{
Pass
{
//ZTest (Less | Greater | LEqual | GEqual |Equal | NotEqual | Always) 分别表示 小于 | 大于 | 小于等于 | 大于等于 | 等于 | 不等于 | 总是
ZTest Greater
//关闭深度缓存,只渲染我自己
ZWrite Off
//设置颜色
Color[_Mask]
}
Pass
{
ZTest LEqual
//设置颜色
Color[_Noocclusion]
}
}
Fallback "Diffuse"
}
Shader "Zhongdudu/Four"
{
Properties
{
_Color("Color",Color)=(1,0,0,1)
}
SubShader
{
Pass
{
// 开启透明混合
Blend SrcAlpha OneMinusSrcAlpha
// 相加
Blend One One
// ⽐较柔和的相加
Blend One OneMinusDstColor
// 乘法
Blend DstColor Zero
// 2倍乘法
Blend DstColor SrcColor
// 开启顶点光照
Lighting On
Material
{
Diffuse[_Color]
}
}
}
Fallback "Diffuse"
}
Shader "Zhongdudu/Five"
{
Properties
{
_MainTex("纹理图片",2D)=""{}
_SeconTex("第二个纹理",2D)=""{}
_MainCol("漫反射颜色",Color)=(1,0,0,1)
_LerpValue("插值比例",Range(0,1))=0
}
SubShader
{
Pass
{
Lighting On
Material
{
Diffuse[_MainCol]
}
//设置纹理
//SetTexture[_MainTex]
//{
// // 融合纹理和其他
// // Combine:融合命令
// // Primary 是来⾃光照计算的颜⾊或是当它绑定时的顶点颜⾊
// Combine texture * Primary
//}
SetTexture[_MainTex]
{
// 纹理的颜色与上面的固定颜色做混合
ConstantColor[_MainCol]
// combine src1 * src2 更暗
// combine src1 + src2 更亮
// combine src1 - src2
Combine texture * Constant Quad
// Texture是在SetTexture中被定义的纹理的颜⾊
// Constant是被ConstantColor定义的颜⾊
// 双倍/四倍 Double / Quad
}
SetTexture[_SecondTex]
{
ConstantColor(0,0,0,[_LerpValue])
// 使⽤源2的透明度通道值在源3和源1中进⾏插值,注意插值是反向的:当透明度值是1是使⽤源1,透明度为0时使⽤源3
Combine Previous lerp(Constant) texture
// Previous 是上⼀次SetTexture的结果
}
}
}
Fallback "Diffuse"
}
using UnityEngine;
public class SetShaderProperties : MonoBehaviour {
private MeshRenderer meshRenderer;
private void Awake()
{
meshRenderer = GetComponent<MeshRenderer>();
}
private void Update()
{
//获取此时材质中Shader中属性的值
float lerpValue = meshRenderer.material.GetFloat("_LerpValue");
lerpValue += Time.deltaTime/5;
//设置材质中Shader中属性的值
//meshRenderer.material.SetFloat("_LerpValue", lerpValue);
meshRenderer.material.SetTextureOffset("_SecondTex", new Vector2(-Time.time,0));
}
}