//一、定义shader标题,经过/定义shader目录
Shader "Custom/MyShader"{
}
复制代码
Properties用于定义Shader中须要使用的属性编程
如下例子分别定义了Int、Float、2D纹理、Vector、Color的属性bash
Shader "Custom/MyShader"{
Properties {
_IntValue("IntValue",Int) = 2
_FloatValue("FloatValue",Float) = 2.0
_MainTex("MainText",2D) = "black"{}
_Vector("Vector",Vector) = (1,1,2,3)
_Color("Color",Color) = (1,1,1,1)
}
}
复制代码
在Properties中定义的属性最终会在Inspector中出现,开发能够在Inspector中重载其初始值函数
定义一个显卡的渲染流程 可配置多个SubShader来定义不一样显卡的渲染任务测试
Shader "Custom/MyShader"{
Properties{
}
SubShader{
Tags{} // 可选 标签
RenderSetup{} //可选 状态
Pass{ // 表示一次完整的渲染流程
}
}
}
复制代码
RenderSetup没有固定的关键字和结构体,只需在SubShader里直接书写对应指令便可,支持的指令如代码所示ui
Shader ...{
...
...{
//剔除指令 可剔除背面、正面渲染或关闭剔除
Cull Off/Back/Front
//深度测试使用的函数
ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always
//深度写入
ZWrite On/Off 开启/关闭
//开启和设置混合模式
Blend SrcFactor DstFactor
}
}
复制代码
全部的RenderSetup都会做用于每个Pass,若是须要单独对某个Pass进行不一样的状态设置,能够单独在Pass里定义以上指令spa
Tags以键值对的形式存在,其定义了 怎样 和 什么时候 进行对象渲染code
Shader ...{
...
...{
Tags {
"Queue" = "Transparent" //渲染顺序
"RenderType" = "Opaque" //着色器分类,用于替换着色器
"DiableBatching" = "True" //是否使用批处理
"ForceNoShadowCasting" = "True" //是否使用投影
"IgnorProjector" = "True" //是否忽略Projector的影响
"CanUseSpriteAtlas" = "True" //是否用于精灵模型
"PreviewType" = "Plane" //设置在材质面板如何预览该材质
}
}
}
复制代码
Shader ...{
...
...{
Pass{
Name "AAAA" //可选
Tags {
"LightMode" = "ForwardBase" //定义Pass在流水线中的的角色
"RequireOptions" = "SoftVegetation" //定义知足某条件时渲染
}
[RenderSetup] //与SubShader里的RenderSetup一致
// other code
}
UsePass "...." //能够使用该方式来复用已经定义的Pass 须要用大写字母
}
}
复制代码
Shader ...{
...
Fallback "VertexLit" // 若是显卡不支持Pass 用该模式
...{
Pass{
}
}
}
复制代码
着色器是指用于渲染的一小段函数对象
Shader ...{
SubShader{
Tags {...}
//表面着色器卸载SubShader里
CGPROGRAM
//在CGPROGRAM和ENDCG之间的就是表面着色器
#pragma surface surf Lambert
struct Input{
float4 color : COLOR;
};
void surf(Input IN,inout SurfaceOutput o){
o.Albedo = 1;
}
ENDCG
}
Fallback ...
}
复制代码
Shader ...{
SubShader{
Tags{ ... }
//顶点/片元着色器定义在Pass里
Pass{
CGPROGRAM
//在CGPROGRAM和ENDCG之间的就是顶点/片元着色器
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 v : POSITION) : SV_POSITION {
return mul (UNITY_MATRIX_MVP , v);
}
fixed4 frag() : SV_Target{
return fixed4(1.0,0.0,0.0,1.0);
}
ENDCG
}
}
}
复制代码