从0开始的技术美术之路(二)向量基础

向量基础

本篇参考 B站视频 “技术美术百人计划”·霜狼_may ;
《Shader入门精要》·冯乐乐女神著;

本篇用于自我复习使用

这一节的大部分其实都是初高中数学基础,虽是基础,但通过向量(也可称为矢量),我们可以做出想要的效果。比如获取相机到物体的距离用于判断并剔除不可见的物体,获取光照到物体的距离,调节物体的受光照效果等等…

一.向量是什么

向量
在这里插入图片描述

1.向量是具有大小(模)方向的有向线段;

2.向量没有位置,只有大小方向

3.向量是从尾指向箭头的,尾部是它的开端,箭头是它的终点;

4.向量的表示,几维就是()里有几个数字,如二维向量(2,4),三维向量(1,2,3);

5.向量通常用于表示相对于某个点的偏移;

6.我们通常用加粗的小写字母表示向量如a,b,c,d(初中学的手写体是上面加箭头)

标量
1.标量只有大小(模),没有方向
2.我们通常使用普通的小写字母来表示标量如a,b,c,d(手写体则是类似于绝对值加| |,我初中教的是这样|a|,视频里是||a||


在这里插入图片描述

1.点是n维空间内的一个位置,无大小和方向

2.点和向量虽然都是()表示,但几何意义完全不同;

零向量
1.零向量大小为0,没有方向,也不是点 (都是向量了,位置怎么会有啊,kora)

2.零向量代表着无偏移,如零标量代表无数量;(虽然啥也没有,它还是有存在价值的)

二.计算

在这里插入图片描述
1.标量与向量之间的加减乘除,对应图上;

2.向量间的加减是每一位与每一位一一对应的;

3.求向量模长:
勾股定理||v||=(||vx||的平方+||vy||的平方)开根号;
||v|| = pow(pow(vx,2)+pow(vy,2),0.5);

4.标准化向量:即单位向量大小为1。
(在计算机动画算法中标准化没说标准化向量 的存在是非常有必要的,标准化相当于度量尺,以便比较,怎么说呢,类似于1千米减10米和50米减10米,虽然减去的都是10米,但1千米的减10其实影响不大,标准化后相当于变成0.99和0.8,能够明显看出其影响)
Vnormal=v/||v||( Unity Shader中的API:normalize)

5.距离公式:形似向量模长的求法,但它几何解释是用于求两个向量间的距离,公式如图;
在这里插入图片描述
在这里插入图片描述
6.向量点积运算:
(ax,ay)·(bx,by)=(axbx+ayby);
a·b=|a||b|*cosθ;
点积运算满足交换律
在这里插入图片描述

几何解释:点乘结果描述两个向量的“相似”程度,点乘结果越大,夹角角度越小,两个向量越接近;

7.向量叉乘运算:
向量叉乘即分量交叉相乘再相减,结果是一个向量,计算公式如下图:
在这里插入图片描述
也可以为:||axb||=||a||·||b||sinθ
向量叉乘不满足交换律,但满足逆交换律 axb=-(bxa)
几何解释:叉乘得到的向量垂直于原来两个向量;

8.向量投影:
几何解释:假设有两个向量 V 和 N,将V分解为两个向量, V平行 和 V垂直 ,V平行 平行于 N,V垂直垂直于N,并满足 V = V平行 + V垂直 ,则称平行分量 V平行 为在 N 上的投影
在这里插入图片描述

在这里插入图片描述

三.兰伯特(Lambert)光照模型

1.它是目前最简单和通用的模拟漫反射的光照模型;
2.原理:使光照反方向为L向量,法线方向为N向量

两向量方向Normal·light=效果
相同1纯亮
相反-1纯黑
垂直0纯黑

在这里插入图片描述

3.半Lambert模型Shader代码:

敲代码时碰见的问题:“:”写成“;”,导致Unity误以为我是使用DirectX的相关语法,自己给我加了一句引用,导致无法运行…


Shader "halflambert" {
	Properties{
	}
	SubShader{
			
			Pass {
				Tags {"LightMode" = "ForwardBase"}

				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				#include "UnityCG.cginc"

				struct VertexInput {
					float4 vertex : POSITION;
					float3 normal : NORMAL;
				};
				struct VertexOutput {
					float4 pos : SV_POSITION;
					float3 normalDir : TEXCOORD0;
				};
				
				VertexOutput vert(VertexInput v) {
					VertexOutput o = (VertexOutput)0;
					o.normalDir = UnityObjectToWorldNormal(v.normal);
					o.pos = UnityObjectToClipPos(v.vertex);
					return o;
				}
				
				float4 frag(VertexOutput i) : COLOR {
				i.normalDir = normalize(i.normalDir);
				float3 LDir=normalize(_WorldSpaceLightPos0.xyz);
				float emissive = dot(i.normalDir, LDir)*0.5+0.5;
				return float4(emissive,emissive, emissive,1);
				}
				ENDCG
			}
	}
		FallBack "Diffuse"
								
}

4.ShaderGraph节点图

连连看遇到的问题:

  • 使用ShaderGraph前,要加载LWRP包,要合适的不要贪高版本,版本不适会报错;
  • 找不到MainLight的选项,这个是要自己写代码完成,代码不长,参考这位大佬的文章
    在这里插入图片描述

5.补充shaderforge Lambert和半Lambert节点图
Clamp 0-1节点将数值规范到0-1,原lambert中将计算结果为负数的,转变为0,以防负数再后面的操作中影响结果,上面的是Lambert

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值