🌈TAAAAAAAAA
视频教程请看B站UP:
庄懂-BoyanTata
📚主旨
美术向TA基础能力培养,使大家可以用技术手段去表达美术诉求。
📚主要内容
📍.Unity 引擎基础;
📍.ShaderForge连连看;
📍.ShaderLab图形编程;
📍.渲染相关的C#脚本;
📚学习路径
根据某一个🍱技术专题进行🍳技术演示,我们再通过学习模仿🍛完成老师布置的作业。
📚HalfLambert卡通着色
💡实现思路
📍.先实现Lambert(兰伯特)光照模型:法线与光反方向的点乘即夹角cos值(-1~1)
float hLambert = dot(lDirWS,nDirWS) * 0.5 +0.5;
📍.然后把兰伯特
转换(Lambert)成半兰伯特
(HalfLambert):(-1~1) =>(0~1)
📍.最后用半兰伯特组装成一个uv坐标采样贴图就大功告成啦🍭
💡连连看
🍖.加个屏幕坐标UV点阵
💡效果
💡连连看
📚最最最简的shader
Shader "ZYF/Homework/Helloworld"
{
Properties
{
}
SubShader
{
Tags {
"RenderType"="Opaque"
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
struct VertexInput {
float4 vertex : POSITION;
};
struct VertexOutput {
float4 pos : SV_POSITION;
};
VertexOutput vert (VertexInput v)
{
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( v.vertex );
return o;
}
fixed4 frag (VertexOutput i) : COLOR
{
return fixed4(1,0,0,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
📚 Shader技巧
💡面板参数声明格式
类型 | 格式 |
---|---|
数值 | _Name(“标签名”,Float) = 0 |
范围 | _Name(“标签名”,range(0,1)) = 0 |
位置、向量 | _Name(“标签名”,Vector) = (0,0,0,0) |
颜色 | _Name(“标签名”,Color) = (1.0,1.0,1.0,1.0) |
2D纹理 | _Name(“标签名”,2D) = “White”{} |
3D纹理 | _Name(“标签名”,3D) = “White”{} |
2D纹理 | _Name(“标签名”,Cube) = “_Skybox”{} |
💡 参数属性
属性 | 用途 | 范围 | 示例 |
---|---|---|---|
[HideInInspector] | 在面板上隐藏该参数 | 任何参数 | [HideInInspector] _FakeLightDir(“假光方向”,Vector)=(0,0,0,0) |
[NoScaleOffset] | 禁用纹理的TilingOffset面板;不需要做TilingOffset的纹理,比如大部分角色纹理,防止美术误设置 | 纹理参数 | [NoScaleOffset] _MainTex(“主贴图”,2D)=“White”{} |
Normal | 标记该纹理参数为法线贴图,以激活自检测功能 | 2D纹理参数 | [Normal] _NormalTex(“法线贴图”,2D)=“bump”{} |
[HDR] | 用于设置高动态范围颜色值,如:灯光颜色、自发光颜色等 | 颜色参数 | [HDR] _EmitCol(“自发光颜色”,Color) =(1.0,1.0,1.0,1.0,1.0) |
[Gamma] | 用于颜色参数的色彩空间的转换;一般用于色彩空间为Linear的项目 | 颜色参数 | [Gamma] _EmitCol(“自发光颜色”,Color) = (1.0,1.0,1.0,1.0) |
[PowerSlider(2)] | 对范围参数做Power处理后再传入Shader;纠正部分参数调节手感; | 范围参数 | [PowerSlider(2)] _SpecPow(“高光次幂”,Range(1.90))=30 |
Header(xxx标签)] | 标签,用于排版 | 单独使用 | [Header(Texture)] |
Space(10)] | 空行,用于排版 | 单独使用 | [Space(10)] |
其它:[Toggle]、[Enum]、[Keyword] |
💡 参数类型
💡 原则上优先
使用精度最低
的数据类型。
💡 世界空间位置和UV坐标:float
。
💡 向量、HDR颜色使用half
;视情况升到float
。
💡 LDR颜色、简单乘子可使用fixed
。
不同平台对数据类型的支持情况不同,一般会自动转换,极少数情况下自动转换会带来问题。
部分平台上数据类型精度转换消耗也不小,fixed也要慎用。
类型 | 位数 | 范围 | 精度 |
---|---|---|---|
fixed | 11 | –2.0~2.0 | 1/256 |
half | 16 | -60000~60000 | 3位小数 |
float | 32 | -3.4e38~3.4e38 | 6,7位小数 |
Int | 32 | 较少使用 | _ |
bool | 布尔型较少使用 | _ | _ |
矩阵:float2x2,float3x3,float4x4 | _ | _ | _ |
sampler2D | 2D纹理 | _ | _ |
sampler3D | 3D纹理 | _ | _ |
samplerCUBE | Cube纹理 | _ | _ |
💡 可访问的顶点Input数据
标签 | 含义 | 类型 |
---|---|---|
POSITION | 顶点位置 | float3 、float4 |
TEXCOORD0 | UV通道1 | float2、float3、float4 |
TEXCOORD1 | UV通道2 | float2、float3、float4 |
TEXCOORD2 | UV通道3 | float2、float3、float4 |
TEXCOORD3 | UV通道4 | float2、float3、float4 |
NORMAL | 法线方向 | float3 |
TANGENT | 切线方向 | float4 |
COLOR | 顶点色 | float4 |
💡常用的顶点Output数据
标签 | 含义 | 类型 |
---|---|---|
pos | 顶点位置CS (ClipSpace) | float4 |
uv0 | 一般纹理UV | float2 |
uv1 | LightmapUV | float2 |
posWS | 顶点位置WS(WorldSpace) | float3 |
nDirWS | 法线方向WS | half3 |
tDirWS | 切线方向WS | half3 |
bDirWS | 副切线方向WS | half3 |
color | 顶点色 | fixed4 |