矢量的点积

点积(也叫内积)的名称来源于这个运算的符号:a•b。中间这个圆点符号是不可省略的,在Unity Shader中,可以直接使用形如dot(a,b)的代码来对两个矢量进行点积 的运算。

点积的公式由两种形式

第一种:两个三维矢量的点积是把两个矢量对应分量相乘然后再取和,最后的结果是一个标量, 公式为:a•b = (ax, ay, az)•(bx, by, bz) = axbx + ayby + azbz

矢量的点积满足交换律,即a•b = b•a

点积的几何意义很重要,因为点积几乎应用到了图形学的各个方面,其中一个几何意义就是投影 

需要注意的是,投影的值可能是负值,投影结果的正负号与a和b的方向有关:当他们的方向相反(夹角大于90)时,结果小于0;当他们的方向互相垂直(夹角为90)时,结果等于0;当他们的方向相同(夹角小于90)时,结果大于0。也就是说,点积的符号可以让我们知道两个矢量的方向关系。

任何两个矢量的点积a•b等同于a在b方向上的投影值再乘以b的长度,也等同于b再a的方向上的投影值再乘以a的长度。

点积具有一些重要的性质,再Shader的计算中,我们经常会利用这些性质来帮助计算。

性质一:点积可结合标量乘法,公式为:(ka)•b = a•(kb) = k(a•b),也就是说对点积中一个矢量进行缩放,相当于对最后的点积结果进行缩放。

性质二:点积可结合矢量加法和减法,公式为:a•(b + c) = a•b + a•c

性质三:一个矢量和本身进行点积的结果,是该矢量的模的平方,公式为:

v•v = vxvx + vyvy + vzvz = |v|²

第二种:从三角代数的角度出发,可以明确地强调出两个矢量之间的角度

公式为:a•b = |a||b|cosθ

以两个单位向量来看^a•^b = 三角形临边 / 三角形斜边 = cosθ,其中三角形临边为^a•^b,斜边为|b|=1

然后由性质一可得:a•b = (|a|^a)•(|b|^b) = |a||b|(^a•^b) = |a||b|cosθ

利用这个公式,可以求得两个矢量的夹角(再0~180之间) θ = arcos(^a•^b),arcos为反余弦操作。

矢量的叉积

矢量的叉积也叫外积,矢量的叉积仍是一个矢量,与点积类似,叉积的名称来源于它的符号:axb

叉号不可省略,两个矢量的叉积计算公式为:

a x b = (ax, ay, az) x (bx, by, bz) = (aybz - azby, azbx - axbz, axby - aybx)

需要注意的是叉积不满足交换律,即a x b ≠ b x a,但是它满足反交换律,即a x b = -(b x a),而且叉积也不满足结合律,即(a x b) x c ≠ a x (b x c)

对两个矢量进行叉积的结果会得到一个同时垂直与这两个矢量的新矢量,新矢量的模(即a x b 的模)等于a的模乘以b的模再乘以他们夹角的正弦值,公式为|a x b| = |a||b|sinθ 该公式与平行四边形的面积公式相同。

推导过程:以a和b为平行四边形的两条边,所以平行四边形的面积=|b|h (h为b边上的高),而h等于|a|乘以sinθ,所以面积 = |b|h = |b||a|sinθ = |a x b|,

若a与b平行(同向或反向),则a x b = 0,(此处的0为零向量,不是标量0)

接下来来看新矢量的方向,这里需要结合左手坐标系和右手坐标系,在右手坐标系中,a x b 的方向使用右手法则来判断,首先将右手的掌心朝向矢量a的方向,然后弯曲四指让其向b矢量的方向靠拢,此时伸直大拇指,大拇指的方向就是新矢量的方向,在左手坐标系中的判断方法同理。

需要注意的是,在左手/右手坐标系中看似a x b的结果不同,但实际上从公式方面来看,结果是一致的,左手/右手坐标系的选择影响的是在三维空间中的视觉效果,如在unity中将左手坐标系换为右手坐标系会发现图像反了。

叉积常用于计算垂直于一个平面、三角形的矢量,还能用于判断三角面片的朝向

Unity Shader学习一:矢量的点积和叉积相关推荐

  1. 《Unity Shader入门精要》学习笔记第5章 开始Unity Shader学习之旅

    本文章用于帮助自己学习,因此只记录一些个人认为比较重要或者还不够熟悉的内容. 原作者:http://blog.csdn.net/candycat1992/article/ 第五章 开始Unity Sh ...

  2. Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)

    Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...

  3. Unity Shader学习-高光反射

    Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...

  4. Unity Shader学习:SSAO屏幕环境光遮蔽

    Unity Shader学习:SSAO屏幕环境光遮蔽 主要思路:1.随机采样像素法线半球周围的像素,平均对比与该像素深度是否处在暗处.2.双边滤波去噪点.3.后期AO图与原图混合. 原文链接:http ...

  5. Unity Shader学习:动态模糊(shutter angle方式)

    Unity Shader学习:动态模糊 动态模糊一般有帧混合和motion vector两种,这里主要介绍motion vector的方法. Keijiro源码:https://github.com/ ...

  6. Unity Shader学习:水墨效果

    Unity Shader学习:水墨效果 偶然在网上看到9级铁甲蛹大神的水墨风格后处理觉得挺有意思,参照着实现一下,还是涉及到之前油画效果的算法,叫什么滤波暂时不清楚,应该用来处理手绘效果挺多的. 水墨 ...

  7. Unity Shader学习:体积光/体积阴影

    Unity Shader学习:体积光/体积阴影 在前向渲染下实现平行光的体积光影效果,需要全屏深度图,延迟渲染会更划算. 思路:通过ray marching的步进点位置计算该点是否在阴影中,采样阴影贴 ...

  8. Unity Shader学习:SSR屏幕空间反射

    Unity Shader学习:SSR屏幕空间反射 本文在前向渲染模式下实现,延迟渲染更适合SSR,这里只简单的实现下,未作更深入的优化. 思路:沿视线和法线的反射向量步进光线,判断打到物体(这里用的是 ...

  9. Unity Shader学习:Dissolve消融效果

    Unity Shader学习:Dissolve消融效果 消融效果在游戏里非常常用,这里简单的实现下,代码里用到了if分支在shader里可能会费一点,如果想直接用puppet_master大佬版本的话 ...

  10. Unity Shader 学习笔记(3)URP渲染管线带阴影PBR-Shader模板(ASE优化版本)

    此 Shader 已经不是最新版本,最新版本见本专栏的第四篇文章: Unity Shader 学习笔记(4) 材质面板截图: 功能实现(URP渲染管线下): PBR材质.投射和接收阴影. 代码展示: ...

最新文章

  1. python的知识点总结云分享_Python工程师面试必备25条Python知识点
  2. 【详解】CPU执行算术运算或逻辑运算时,常将源操作数和结果暂存在()中
  3. SAP Fiori UI上的三个catelog对应后台的JSON返回
  4. 最后的代课老师———漆红玉[转]
  5. 在Oracle中使用JDBC插入功能
  6. World Wind Java开发之六——解析shape文件(转)
  7. Springboot的web开发-静态资源
  8. FileReader图片上传并预览
  9. java数组基本操作
  10. 华硕主板装系统蓝屏_华硕笔记本电脑重装系统后蓝屏怎么办
  11. 深度学习岗位面试记录
  12. Ubuntu: 使用U盘拷贝文件
  13. 最适合管理的计算机语言,PLC 编程语言的优劣,哪种语言更适合编程
  14. PL330 DMAC笔记(2) - DMAC接口,状态机,初始化,APB slave接口
  15. 宝塔面板修改默认的放行端口8888为8001并且生效
  16. 腾讯云API接口鉴权v3 鉴权失败问题 AuthFailure.SignatureFailure
  17. 小米9等备份原机的基带相关分区镜像防止基带未知丢失ADB指令-icloudelectron修正
  18. main函数中的argc和argv是什么意思?
  19. 【Visual C++】游戏开发笔记三十二 浅墨DirectX提高班之一 DirectX大局观认知篇
  20. 揭秘朝鲜自主操作系统:红星Red Star

热门文章

  1. Python关于None的报错:'NoneType' object is not iterable和cannot unpack non-iterable NoneType object
  2. VOC数据集转YOLO数据集
  3. SQL Server 列转行的实现
  4. 随机变量及其分布函数
  5. 毕业论文怎么选题?利器推荐
  6. 我叫MT online
  7. 梯度消失和梯度爆炸问题详解
  8. 二十、Java虚拟机内存结构
  9. 波老师(teacher)
  10. 什么是mysql的读写分离_什么是数据库读写分离?