...menustart
...menuend
- 网格数据
- 顶点函数
- 顶点到片元结构体
- 片元函数
- 对象渲染到屏幕
- 常数属性数据 Properties
- shader的变量
- 可以由
资源,脚本和动画数据
驱动 - 可以起 vertex/fragment 函数中使用
- 网格数据
- 将 网格mesh 数据输入到 Shader
- 使用 appdata struct 把网格数据 直接给 顶点函数
struct appdata
{
float4 vertex : POSITION ;
float2 uv : TEXCOORD0 ;
// 也可使用 UV TEXCOORD 1,2 等
float3 normal : NORMAL ;
float4 tangent : TANGENT ;
float4 vertexColor: COLOR ;
}
- 冒号后边的是语义,帮助结构体更好的传递,以及更容易被理解
- 用来构建对象
- 输入参数是 网格数据, 输出的是 顶点到片元struct ( Vertex to Fragment , 简称 v2f )
v2f vert(appdata v)
{
v2f o;
// 在这里操纵你对象的结构
o.vertex = UnityObjectToClipPos( v.vertex );
o.uv = TRANSFORM_TEX( v.uv, _MainTex )
return o;
}
- UnityObjectToClipPos 封装了 computing M*VP matrix product
- v2f 用于存储从 顶点函数 输出和 片元函数 输入的数据
- 计算输出的 顶点位置, 自动绘制在屏幕上
struct v2f
{
float2 uv : TEXCOORD0 ;
float4 vertex: SV_POSITION ;
}
- SV_POSITION : sv 是 system value的简写,system 代表屏幕
- 同样可以根据需要,输出更多的需要的数据
struct v2f
{
float2 uv : TEXCOORD0 ;
float4 vertex: SV_POSITION ;
float3 positionOfObject : TEXCOORD1 ;
float normalAngle : TEXCOORD2 ;
float4 calculatedLightingColor : COLOR0;
}
- 可变数据浮点数
- float 高精度 , 一般 32 bit
- half 中精度 , 一般 16 bit
- fixed 低精度 , 一般 11 bit
- 值域 0-2, 可以用于 COLOR 表示
- 用于 画 你的对象
- 将输入的 v2f结构体 和输出数据绘制到 屏幕上
fixed4 frag (v2f i) : SV_Target
{
// 纹理采样
fixed4 col = tex2D( _MainTex , i.uv )
return col ;
}
- SV_Target : 输出到 屏幕上的一个像素点
- SubShader
- 每个shader可以有多个 SubShader , 一般会根据我运行的平台的不同而去使用不同的 SubShader
- Tags
- 告知 SubShader 如何,何时去渲染物体
- eg. "RenderType"
- eg. "LightMode"="ForwardBase" 光照模式
- Pass
- 每个 SubShader 可以有多个 Pass, eg. 有个pass处理外套的光照,有个pass处理钩边
- 每个Pass 会单独占用一个draw call
- CGPROGRAM / ENDCG
#pragma vertex vert
- 声明 vertex 函数
vert
- 声明 vertex 函数
#pragma fragment frag
#include "UnityCG.cginc"
引入库float4 _TintColor;
- 在 CG 中实例化 shader Properties
- FallBack
- 后备方案
- Texture Blending - lerp
- Texture Cutout : 渐渐消失的效果
_Cutout_Value( "Cutout Value" , Range(0.0, 1.0))=0.5
float4 cutoutTextureColor = tex2D(_Cutout_Texture, IN.cutoutUV);
clip( cutoutTextureColor.rgb - _Cutout_Value ) ;
- Normal Extrusion
- vertex 坐标受到法线方向的 挤压
- 变胖子或瘦子
- animation clip 动画控制shader
- eg. set
Skinned Mesh Render.Material._Wave_Distance
- eg. set
- 脚本控制