本系列文章是学习siki学院Unity Shader入门(Unity2018.3)笔记
一.Unity创建Shader时4种类型
1.Standerd Surface Shader : unity对顶点片元的封装.更加方便编写
2.Unlit Shader : 顶点片元shader
3.Image Effect Shader : 图片特效shader
4.Compute Shader : 一般用不到
Shader Variant Collection : shader库
渲染需要的东西 :
1.mesh/particle system
2.材质球
3.shader
二.shader基本结构
以新建的Unlit Shader为例 :
1.路径/shader名
Shader "Unlit/001" //路径/shader(建议与文件名保持一致)
2.属性块Properties
//属性块 : 在inspector面板上可以看到
Properties
{
//_Int类型的变量,名称为Int
_Int("Int",Int) = 2
//_Float类型的变量,名称为Float
_Float("Float",float) = 1.5
//_Range(范围)类型的变量,名称为Range,范围是0.0-2.0(float)
_Range("Range",range(0.0,2.0))= 1.0
//_Color(四维变量的颜色值)类型的变量,名称为Color
_Color("Color",Color) = (1,1,1,1)
//_Vector : 四维变量,矩阵/多个变量时用_Vector进行传递
_Vector("Vector",Vector) = (1,4,3,8)
// Texture : 面板上显示的命名 2D : 类型,是2D图片 white : 默认值,白色 _MainTex : 变量,基本上都会加一个_
_MainTex("Texture", 2D) = "white" {}
//_Cube : 天空盒CubeMap
_Cube("Cube",Cube) = "white"{}
//比较少用 :
_3D("3D",3D) = "black"{}
}
3.SubShader
//真正的变量定义是在这里,可以定义多个SubShader,使用时会根据平台扫描第一个可运行的SubShader进行执行,如果SubShader全都不能执行就会执行Fallback
SubShader
{
//标签 可选 key = value
Tags
{
"Queue"="Transparent"//渲染顺序
"RenderType"="Opaque"//着色器替换功能 : 渲染完成之后进行替换
"DisableBatching" = "True"//是否进行合批 : 动态静态合批
"ForceNoShadowCasting" = "True"//是否投射阴影
"IgnoreProjector"="True"//受不受Projector的影响,通常用于透明物体
"CanUseSpriteAltas" = "False"//是否用于图片的Shader,通常用于UI
"PreviewType"="Plane"//用作shader面板预览的类型
}
//Render设置 可选
//Cull off (裁剪) /back/front //选择渲染那个面
//ZTest Always/Less Greater/LEqual/GEqual/Equal/NotEqual //深度测试
//Zwrite off/on //深度写入
//Blend SrcFactor DstFactor//混合
//LOD 100 //不同情况下使用不同的LOD,达到性能提升
//必须,如果有多个,按照顺序渲染,正常不建议使用多个Pass通多,多一个会多一个drawcall
Pass
{
//Name "Default" //Pass通道名称
Tags
{
"LightMode"="ForwardBase"//定义该Pass通道在Unity渲染流水中的角色
//"RequireOptions"="SoftVegetation"//满足某些条件时才渲染该Pass通道
} //可以在每个Pass通道里面进行定义
//Render设置 可以在每个Pass通道里面进行定义
//CG语言所写的代码,主要是顶点片元着色器
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex; //定义的变量与Properties中名称保持一致
float4 _MainTex_ST; //如果在属性块没有,那么要使用C#代码进行传值
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
//Fallback "Legacy Shaders/Transparent/VertexLit" Fallback Off //当上面shader运行不了的时候会使用下面shader渲染
总结:
网友评论