Unity Shader学习一:矢量的点积和叉积

这篇具有很好参考价值的文章主要介绍了Unity Shader学习一:矢量的点积和叉积。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

矢量的点积

点积(也叫内积)的名称来源于这个运算的符号: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中将左手坐标系换为右手坐标系会发现图像反了。

叉积常用于计算垂直于一个平面、三角形的矢量,还能用于判断三角面片的朝向文章来源地址https://www.toymoban.com/news/detail-476308.html

到了这里,关于Unity Shader学习一:矢量的点积和叉积的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习·理论篇(2023版)·第002篇深度学习和计算机视觉中的基础数学知识01:线性变换的定义+基于角度的线性变换案例(坐标变换)+点积和投影+矩阵乘法的几何意义+图形化精讲

    💕 恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡 本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡 本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理

    2023年04月08日
    浏览(43)
  • Shader学习第七篇:几种Unity的Shader的例子

    下面是几种Shader的例子,从简单到复杂,一步一步了解 Shader 的编写机制。 顶点/片元着色器 Vertex/Fragment Shader,下面我们介绍的示例就是这个。 表面着色器 Surface Shader ,而这个底层Unity也是转成了顶点/片元着色器 固定函数着色器 Fixed Function Shader (已弃用) 在一些低端设备使

    2024年02月09日
    浏览(41)
  • 【Unity Shader 学习笔记】ShaderLab

    什么是ShaderLab? ShaderLab是Unity为开发者提供的高层级的渲染抽象层,是专门用来编写UnityShader的一种说明性语言。 Unity shader的基本结构 材质和Unity Shader的桥梁:Properties Properties语义块包含了一系列属性,这些属性会显式的出现在材质面板中。便于开发者在材质面板中能够方便

    2023年04月26日
    浏览(26)
  • Unity Shader学习3:透明效果

    Unity中的透明效果由透明通道控制(RGBA中的A),其值为0是完全透明,为1时完全不透明。有两种方法可以实现透明效果: 透明度测试(Alpha Test) 和 透明度混合(Alpha Blend) 。 透明度测试是指通过特定的条件(通常是Alpha通道的值是否超过某个阈值)来判断片元是否透明,只

    2024年01月19日
    浏览(49)
  • shader学习摘要(九)unity阴影

    在前向渲染中,如果场景中最重要的平行光开启了阴影,unity就会为该光源计算它的阴影映射纹理(shadowmap)。这张阴影映射纹理本质上也是一张深度图,它记录了从该光源的位置出发、能看到的场景中距离它最近的表面位置(深度信息)。 我们通过修改光源的light控件下的

    2024年02月08日
    浏览(39)
  • Unity Shader学习1:基础光照模型

    Phong光照模型 是描述物体的直接光照的简易模型,它认为从物体出发进入摄像机的光由四部分组成: 自发光(emissive),环境光(ambient),漫反射(diffuse),高光(specular)。 c = c e m i s s i v e + c a m b i e n t + c d i f f u s e + c s p e c u l a r c = c_{emissive} + c_{ambient} + c_{diffuse} + c_

    2024年02月03日
    浏览(37)
  • Unity Shader学习(九)物体边缘实现

    根据前面的学习,我们了解到除了可以对点的颜色进行处理,还可以对点本身进行操作,例如我们可以改变点的位置,这样就可以实现对模型渲染的操控。物体边缘效果是我们常用的一种效果,要实现物体边缘,原理也很简单。 首先我们要了解到,模型在渲染时,有正面和背

    2024年02月16日
    浏览(38)
  • Unity Shader入门精要学习——透明效果

    要么完全透明,要么完全不透明。 实现简单,实质上是一种剔除机制,通过将不满足条件(通常使用小于某个阈值来判定,一般使用clip方法)的片元舍弃的方法来达到完全透明效果。这些被舍弃的片元不会再进行任何的处理,也不会对颜色缓冲产生任何影响,其余满足条件

    2024年02月17日
    浏览(35)
  • Unity Shader 学习(一):初识ShaderLab -- 以“Unlit Shader”模板为例 01

    阅读本文前需要对 渲染流程 有简单了解,并且要知道 Unity ShaderLab、Cg/HLSL 大概是什么,它们并不是一回事。 然后, 看什么教程都不如直接看官方文档: ShaderLab - Unity手册 HLSL参考 首先创建一个 Unlit Shader 模板(Project 窗口,右键 → Create → Shader → Unlit Shader) 直接上代码:

    2024年02月03日
    浏览(26)
  • Unity Shader 学习(二):初识ShaderLab -- 以“Unlit Shader”模板为例 02

    上一篇:Unity Shader 学习(一):初识ShaderLab – 以“Unlit Shader”模板为例 01 在Unlit Shader模板中引用了 UnityCG.cginc 中的很多宏和函数方法,这篇继续学习模板中的几个函数以及 UnityCG.cginc 中一些可能会用到的结构;最后再了解一些自己写Shader时大概率会用到的Cg/HLSL函数方法。

    2024年02月03日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包