参考视频:
图形 1.2.1 向量基础
线性代数的本质 - 01 - 向量究竟是什么?
参考书籍:《untiy shader入门精要》
向量的定义
向量是只有大小和方向,没有位置属性的有向线段
标量是只有大小没有方向的向量,在线性代数中和“数字”是一个概念
向量的模长
向量的模长(大小)由勾股定理得出
零向量
向量各种计算的几何意义
·向量的加减:如果把向量看作一段位移,那么向量的加减相当于位移的合成
·向量与标量的乘法和除法:相当于向量的缩放,除标量a相当于相当于乘上a的倒数
·向量的归一化:向量除它的模长等于大小为1的单位向量
·向量的点积:相当于a在b向量上的投影与b的大小相乘
(当ab都是单位向量时,ab的点积等于cosθ(a与b夹角的余弦值))
向量的点积还描述了两个向量之间的相似程度,如果向量的点积结果为负数,则说明向量方向相反,为正数则相同,为0则垂直,且结果越大,说明两个向量的夹角越小
·向量的叉积:向量的叉积结果仍是一个向量,此向量
大小:等于a与b向量形成的平行四边形的面积
方向:垂直与a、b所在平面,具体朝里朝外与左手坐标系还是右手坐标系有关
作业:兰伯特和半兰伯特光照模型
兰伯特模型用shaderlab+hlsl编写(因为之前写过所以就稍作修改),代码如下
Shader "Custom/Lambert"{
Properties{
_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
}
SubShader{
Pass{
Tags { "LightMode" = "UniversalForward"}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
half4 _Diffuse;
struct a2v {
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
};
struct v2f{
float4 positionCS : SV_POSITION;
half3 normalWS : TEXCOORD0;
};
v2f vert(a2v v){
v2f o;
o.positionCS = TransformObjectToHClip(v.positionOS.xyz);
o.normalWS=TransformObjectToWorldNormal(v.normalOS.xyz);
return o;
}
half4 frag(v2f i) : SV_Target {
Light light=GetMainLight();
half3 worldLight = normalize(light.direction.xyz);
half3 diffuse = light.color.rgb * _Diffuse.rgb * saturate(dot(i.normalWS, worldLight));
return half4(diffuse, 1.0);
}
ENDHLSL
}
}
FallBack "Hidden/Universal Render Pipeline/FallbackError"
}
半兰伯特模型用shader graph连连看
左边是兰伯特模型,右边是半兰伯特模型