庄懂的TA笔记(十)<实践大练兵+ 答疑 + 作业 >
0、总结:
1、 兰伯特 Lambert = n dot l
2、 菲涅尔 Fersnel = 1-(N dot V)
3、 天空盒反射 CubeMap
vrDir = reflect(-vDirWS , nDirWS);
texCUBElod (_Cubemap,float4(vrDirWS , _CubemapMip ));
4、 高光 phong = r dot v 或 blinPong = n dor h
rDir = reflect(-lDir , nDir)
5、 半高光 Blin Phong = n dot h
hDir = vDir + lDir (归一化)
6、 自阴影 Attenuation
7、 环境遮蔽 AO Occlution
8、 环境色三色 Evn 3Cut Col
9、 法线 1、UnPackNormal 2、TBN矩阵
10、 直接映射 MatCap : matCap = tex2D(_MatCapMap,matCapUV);
1、作业展示:
技术只是一支笔,技术和美术的联调的成功,才是最终结果。
2、答疑:
不要按图索骥。
要有勇气先接下来这件事,然后再这件事的过程中,学会怎么做这件事。
这么多专业向的TA都是怎么来的呢,实际上来由,是人力招聘的TA满足不了产能,需要很多很多TA,但是人太少了,招不到这么多,培养周期比较长,跟不上。
解决办法就是把方向分的非常细致,这样的好处是培养周期要比全才,短很多。
是从企业效率考虑的,不是根据你跟人的职业发展考虑的,更不是你的兴趣方向考虑的。
3、OldSchoolPro 在SF中的 思路:
第一习惯:分析光照构成
四段式写法
五段式写法
4、OldSchoolPro 在SL中的 思路:
需要的贴图:
BaseColor(注意,BaseColor 和 abdol 是两 概念,很类似,但有差异)
RGBA:
R
G
B
A: 其中A通道中,放了AO >>>>>>>>
Normal Map(unity中自带的法线编码,解码 是不能 塞其他信息的,所以有时可以自己写编码解码)
RGB
R
G
B
A:
smoothness Map
RGBA: >>>>>>>>
R
G
B
A: 高光次幂黑白贴图(实际就是 金属度,和 平滑度 贴图) >>
什么时候用 mul : (向量 乘 矩阵)
什么时候用 * :(float3 * 1) = float3(f1*1,f2*1,f3*3) 分别对应去乘,float3 * float2 也是同理。
什么时候用 dot : 两个向量相乘
插值:
unity shader shaderLab 手册 | 码农家园
lerp(a, b, f)
lerp (a最大值, b最小值, f权值 )
代码示例:
Shader "Unlit/Sc010_OldSchoolDirLight04"
{
Properties
{
//光照模型(基础光照)
[Header(Texture)]
_MainTex ("Texture", 2D) = "white" {}
_MainCol ("Color",Color)=(1,1,1,1)
_SpecularPow("高光次幂",Range(1,90))=30
_SpecularTex("高光贴图",2D) = "white" {}
_NormalTex ("法线贴图", 2D) = "bump" {}
//光照模型(环境光照)
[Header(Diffuse)]
_UpCol ("UpColor",Color)=(0.5,1,1,1)
_SideCol ("UpColor",Color)=(1,0.5,1,1)
_DownCol ("UpColor",Color)=(1,1,0.5,1)
_EvnDiffInt ("环境光强度",Range(0,5)) = 1
_EvnSpecInt ("环境光反射强度",Range(0,10)) = 5
_EmitTex ("自发光贴图",2D) = ""{}
_EmitInt ("自发光强度",Range(0,5)) = 0
_FersnelPow("金属菲涅尔次幂",Range(0,10))=5
_CubeMap("环境球贴图",cube) = "_Skybox"{}
_CubeMapMip("环境球粗糙度",Range(0,7))=3
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
#include "AutoLight.cginc"
#include "Lighting.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
UNITY_INSTANCING_BUFFER_START( Props )
// UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
UNITY_INSTANCING_BUFFER_END( Props )
//光照模型(基础光照)
uniform sampler2D _MainTex;
uniform sampler2D _SpecularTex;
uniform sampler2D _NormalTex;
uniform float3 _MainCol;
uniform float _SpecularPow;
//光照模型(环境光照)
uniform float3 _UpCol;
uniform float3 _SideCol;
uniform float3 _DownCol;
uniform float _FersnelPow;
uniform float _EvnDiffInt;
uniform float _EvnSpecInt;
uniform sampler2D _EmitTex;
uniform float _EmitInt;
uniform float _CubeMapMip;
uniform samplerCUBE _CubeMap;
//输入结构
struct VertexInput
{
float4 vertex : POSITION;
float2 uv0 : TEXCOORD0;
float4 normal : NORMAL;
float4 tangent :TANGENT;
};
//顶点输出结构
struct VertexOutput
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 posWS : TEXCOORD1;
float3 nDirWS : TEXCOORD2;
float3 tDirWS : TEXCOORD3;
float3 bDirWS : TEXCOORD4;
LIGHTING_COORDS(5,6)
};
//输出结构>>>顶点shader>>>输出结构
VertexOutput vert (VertexInput v)
{
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos(v.vertex);
o.posWS = mul(unity_ObjectToWorld,v.vertex);
o.nDirWS = UnityObjectToWorldNormal(v.normal);
o.tDirWS = normalize(mul(unity_ObjectToWorld,float4(v.tangent.xyz,0.0)).xyz);
o.bDirWS = normalize(cross(o.nDirWS,o.tDirWS)*v.tangent.w);
o.uv = v.uv0;
TRANSFER_VERTEX_TO_FRAGMENT(o)
return o ;
}
//色彩输出结构
float4 frag(VertexOutput i) : COLOR
{
//向量准备
float3 var_NormalTex = UnpackNormal(tex2D(_NormalTex,i.uv)).rgb;
float3x3 TBN = float3x3(i.tDirWS,i.bDirWS,i.nDirWS);
float3 ndirWS = normalize(mul(var_NormalTex,TBN));
float3 ldirWS = _WorldSpaceLightPos0.xyz;
float3 vdirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS);
float3 hdirWS = normalize(vdirWS + ldirWS);
float3 vrdirWS = reflect(-vdirWS,ndirWS);
//贴图采样
float4 var_mainTex = tex2D(_MainTex,i.uv);
float4 var_specTex = tex2D(_SpecularTex,i.uv);
float3 var_EmitTex = tex2D(_EmitTex,i.uv);
float cubemapPow = lerp(_CubeMapMip,0,var_specTex.a);
float3 var_Cubemap = texCUBElod(_CubeMap,float4(vrdirWS,cubemapPow)).rgb;
//中间变量
float3 baseCol = _MainCol * var_mainTex;
float specPow = lerp(1,_SpecularPow,var_specTex.a);
float attenuation = LIGHT_ATTENUATION(i);
//点积结果
float ndotl = dot(ndirWS,ldirWS);
float ndoth = dot(ndirWS,hdirWS);
float ndotv = dot(ndirWS,vdirWS);
//光照模型公式(直接光照)
float lambert = max(0,ndotl);
float specCol = var_specTex.rgb;
float blinPhong = pow(ndoth,specPow);
float3 dirLighting = (baseCol*lambert+var_specTex*blinPhong)*attenuation;
//光照模型公式(环境光照)
float upMask = max(0,ndirWS.g);
float downMask = max(0,-ndirWS.g);
float sideMask = 1 - upMask - downMask;
float3 envCol = _UpCol*upMask+_SideCol*sideMask+_DownCol*downMask;
float fersnel = pow(1-ndotv,_FersnelPow);
float occlusion = var_mainTex.a;
float3 envLighting = (baseCol*envCol*_EvnDiffInt+var_Cubemap*fersnel*_EvnSpecInt*var_specTex.a)*occlusion;
float3 emission = var_EmitTex * _EmitInt;
float3 finalRGB = dirLighting + envLighting + emission;
//返回输出
return float4(finalRGB,1.0f);//输出最终颜色
}
ENDCG
}
}
FallBack "Diffuse"
}