基础shader分析
常见的语义词:
- 获取顶点 — float4 vertex : POSITION;
- 获取第一uv — float2 uv : TEXCOORD0;
- 获取发现 — float3 normal : NORMAL;
- 获取顶点色 — float4 color : COLOR;
- 获取切线 — float4 tan : TANGENT;
常用的数据类型对应
精度设置float – 32位,half – 16位, fixed – 8位
- float常用于坐标点
- half常用于UV和大部分向量
- fixed常用于颜色
基础shader内容:
获取位置坐标并输出
1 | 1. 基础变换 -- 顶点着色器中将物体转换到裁剪空间 |
需要注意的内容
在声明的构造体appdata和v2f中的TEXCOORD0是有差别的
1 | struct appdata{ |
获取uv贴图并输出
1 | 1. 基础变换 -- 顶点着色器中将物体转换到裁剪空间,获取uv |
背面剔除
1 | Properties{ |
Alpha Test
对clip()函数的使用:
大体思路:
- 通过tex2D获取r通道
- 对gradient进行操作
- 输出gradient.xxxx
1 | half4 frag(v2f i): SV_Target{ |
半透明混合
大体思路:
- 在pass中打开Blend src dst
- 关掉Zwrite – Zwrite off
- Subshader中Tags = {“Queue” = “Transparent”}
在贴图没有alpha通道的时候怎么做
1 | // 尽量将颜色和alpha分开写,最后再组合 |
边缘光
实质,dot(n,v)
- 实现设置强度
- 实现设置对比度
- 预先写深度 — 通过提前写一个pass,并且在里面设置ColorMask 0将颜色信息的写入取消
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32// 这里顶点着色器仅写了相关代码
v2f vert(appdata v){
// normal计算方式
o.normal_world = normalize(mul(float4(v.normal,0.0), _Object2World).xyz);
// 视线计算方式,相机位置减去点的位置
float3 pos_world = mul(_Object2World, v.vertex).xyz;
float3 view_world = normalize(_WolrdSpaceCameraPos.xyz - pos_world);
}
// 片元着色器中计算 N dot V
half4 frag(v2f i):SV_Target{
float3 normal_world = normalize(i.normal_world);
float3 view_world = normalize(i.view_world);
float NdotV = saturate(dot(normal_world, view_world));
float3 col = _MainColor.xyz * _Emiss;
// 对比度
float fresnel = pow((1.0 - NdotV), _RimPower);
// 强度
float alpha = saturate(fresnel * _Emiss);
return float4(col, alpha);
}
// 如何设置强度
float alpha = (1.0 - NdotV) * _Emiss;
// 如何设置对比度
float fresnel = pow((1.0 - NdotV), _RimPower);