GAMES101 Geometry part01



**回顾:**前几节课我们讲了给定一个模型,我们可以做对这个模型进行着色,

  • 我们可以做flat shading或者是在顶点上或者fragment上进行着色,从而得到一个更好的结果.
    在这里插入图片描述

  • 但是用什么方法是取决于面、点或者像素出现的频率,如果面的频率出现很高的话,那么用flat shading也是可以达到一个平滑的效果,如上图中最后一行。如果使用flat shading就能达到一个不错的效果,那么如果使用Phong shading的话就会增加额外的计算量,效率上就会降低.

在这里插入图片描述

  • 然后我们可以在这个模型上贴一张图,从而可以看到带有Shading,但是在任何一个点它的颜色又不一样的一个结果.同一个模型采用不同的贴图产生了效果也会不一样.
    在这里插入图片描述
  • 但是贴图这个过程并不简单,我们还要考虑纹理太大纹理太小该如何处理,纹理太小时我们可以使用线性插值,纹理太大时我们会使用mipmap各项异性过滤来处理.

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020122116033847.png)

从这幅图中我们可以看到它反射了一个天空和地面的样子,那么它反射出来的东西是什么?如何去表述它?

这就是今天要讲的关于shading的一些尾巴,也就是纹理的应用,对于这个例子叫做环境光照.

纹理的应用

在这里插入图片描述

我们之前提到过纹理就是一张图,这是没错的.

纹理本身可以做各种各样的操作,比如Mipmap,由于mipmap应用十分广泛所以现在在硬件都支持Mipmap,

因此我i们其实可以将纹理理解为:

纹理 = 内容 + 范围查询(滤波)

“在现代GPU理,我们可以将纹理看作一块内存,并且我们可以在这块内存上的一块区域进行范围查询或是一个滤波操作,也可以理解为就是我们可以对一个区域进行点查询或者范围查询,职这个查询十分快.”

也就是将纹理看成是一块数据,我们可以对其做不同的查询,而不是简单的将纹理只限制在图像这一概念里.
从这个角度出发的话,纹理就可以表示很多东西了:

Environment Map(环境光映射或者环境贴图)

顾名思义就是将环境光存储在一个贴图之上。
在这里插入图片描述
我们假设自己处在一个房间内,向屋内的各个方向看去,我们都能看见屋内的设施或者物体,也就是每个方向都是有光的,不管它是直接光照还是通过反射从而得到的间接光照.

我们在任意方向都可以看见光,然后我们把任一方向来的光(物体)都记录下来,这就是环境贴图.

我们看图中左半部分,这张图就是我们在一个屋子里往四面八方看得到的总样貌,这四堵墙以一种展开的形式呈现,我们可以看到墙壁,门,窗户,这代表有光从物体表面到人眼睛,我们不管他是直接光还是间接光,反正就是有光存在.

我们用这幅图去渲染茶壶,得到右边部分,这个茶壶会被环境光所照亮,也就是茶壶能够反射屋内任一方向来的光,也就是我们将每个方向的物体给映射到茶壶表面了.

因此我们可以用纹理来描述整个环境光的样子,然后我们再用这张环境纹理去渲染其他的物体,

这样比点光源直接进行的效果好很多.其本质还是纹理贴图,只是纹理来源于周围环境。

注意!:
我们在用纹理描述环境光时有一个假设,我们认为环境光来自无限远处没有什么实际的深度意义,也就是只需要记录光的方向信息.

1.Spherical Environment Map(球面环境映射)

在这里插入图片描述
从图中的球表面我们可以看到一个环境光(环境贴图),如何它是得到的呢?

我们通过在屋子里放一个表面非常光滑接近于镜子的金属球,那么镜子反射出的东西不就是环境光嘛.
在这里插入图片描述

从而给我们提供了一个存储环境光的办法,我们将环境光存储在球上然后就像展开地球仪表面一样,:我们将球表面展开从而得到环境纹理:
在这里插入图片描述

但是这样做所得到的环境贴图存在扭曲问题,我们可以明显的看见图片的上方和下方会出现向两极扭曲的情况.

至此,我们确实成功的将环境映射在了球上,但是我们无法得到一个描述均匀的环境纹理,在靠近极点的方向会出现扭曲现象.因此引出了另一个办法Cube Map,也就是天空盒:

2.Cube Map(立方体贴图)

在这里插入图片描述

我们假设仍然将环境光存放在球的表面上,但是这个球外有一个立方体包围盒包着它,

我们找记录在球上的一点,此时我们从球心连一条线到这个点上,然后继续延长直到触碰到立方体的表面上,

也就是我们不再将环境光存放在球面上,而是通过一系列操作将环境光存放在立方体表面上,

(简单来说就是利用方向计算出与对应平面上的交点坐标,剔除平面所对应的一维,剩下来的两维坐标转换到(0,1)范围之内即为(u,v)坐标。

举个例子: 一个方向为(1,2,3)则其与z = 1平面的交点为(1/3,2/3,1) (找最近的平面交点),剔除z轴之后剩下为(1/3,2/3), 在进行(1+x)/2的转换(因为方向存在负值,而uv坐标不存在),则得到z = 1的那一幅Texture上的 uv坐标为(2/3,5/6)。)

因此我们就得到了六张图,展开之后:

在这里插入图片描述

Bump Mapping 凹凸贴图

纹理除了可以表示颜色之外,仍然可以定义很多的属性,比如在凹凸贴图中,我们可以定义在一个表面上任意一个点的相对高度.

相对高度就是,假设有一个基础的平面,我们认为一个点纹理可以定义在基础平面沿着它的法线方向往上往下各走多少长度,这个长度就是相对高度
在这里插入图片描述
定义相对高度的好处是,上图中我们可以看到其模型是一个球体,一个球可以用一两百个三角形表示出来,但是如果要用三角形表示出上图的凹凸不平的效果,需要很多的三角形.

但是,应用凹凸贴图的话会方便很多,假设我们仍然定义在三角形的顶点上有对应的纹理坐标,三角形内部任意一点也有它的纹理坐标,可以查询出来在纹理上任意一点它的相对高度是多少.
也就是我们在不把几何形体变复杂的情况下,通过应用一个复杂的纹理从而定义任何一点上的相对高度,高度变化与之对应的法线也会发生变化,法线一旦变化我们shading的结果也会发生变化,产生了明暗对比,从而达到一个凹凸的效果.

也就时我们通过定义一个假的法线从而得到一个假的shading结果,产生明暗对比来欺骗人的眼睛.实际上我们并没有改变高度,纹理仍是一个二维的贴图.

1.Bump Mapping原理

在这里插入图片描述
例如图中的黑线和黄线,黑线是物体的表面所在,黑色向量是p点的法向量.
黄线是我们想要表达出的一个平面,黄线上的点是我们设置的相对高度的一个点,黄色向量是垂直于它的法向量.

接下来我们先不考虑二维的贴图或者三维的空间,我们先用一维的函数来讲解如何求出法向量:
在这里插入图片描述

我们知道,求出一个点的切线的做法其实就是一个求导问题,我们用相邻两个点的高度差 / 两点之间的间隔就可以求出其切线,这里我们认为两点之间的距离为1,在引入一个常数c,其作用是进行缩放.至此我们求出了这一点的切线,其切线向量是 (1,dp) ,我们知道一个点的法线是垂直于它的切线的,因此其法向实际上就是将切线逆时针旋转90度,因此根据旋转公式最终我们可以知道法线为 (-dp,1).
在这里插入图片描述
用在二维贴图上也是一样的,假设原本的法向量是(0,0,1),我们分别求出一点在u,v两方向上的切线,之后也是一样的原理,求出切线,然后旋转90度就是法线了,这里我们将过程简化,直接得法线为

(-dp / du, - dp / dv , 1)

注意,此时我们求出的法向量是在切线空间里,也就是local,而不是世界坐标上,此时只需要左乘一个TBN矩阵就可以将其变换到世界坐标里了.

TIPs:

TBN矩阵是根据,以n向量(0,0,1),t和n定义的一个新的坐标系,其中t,b,n的坐标都是可以求出来的.

简单的说,假如有两个向量V,两个不同的坐标系,a,b:

V_a = Transform_b * V_b

这个Transform_b是什么呢?

问题在这里,我们已知的t,b,n都是在世界坐标系下的t,b,n,是相对于世界原点而言的。所以这决定了推导公式的方向是从Local -> World来推导。

所以 local坐标系中的(1,0,0)对应世界坐标系的(tx,ty,tz),之后我们可以求出矩阵Transform_b 是 b坐标系的三个坐标基,在a坐标系的表示,也就是==[向量t,向量b,向量n ].==

即 将局部坐标转成世界坐标系需要乘以TBN矩阵.

Displacement mapping

在这里插入图片描述

我们可以看到凹凸贴图确实体现出了一个凹凸的效果,但是跟位移贴图一比就可以看出差距,

因为位移贴图确实对三角形的顶点进行了移动,改变了点的高度,因此可以表现出凸起部分的阴影,显得更加真实.

但是这种贴图要求模型足够细,也就是相比于凹凸贴图的模型多出了很多个三角形.

几何

几何形体是计算机图形学当中十分重要的一部分内容,无论是人物,风景,建筑,都离不开几何,如何表示好各种各样的模型是几何部分的主要研究内容之一。作为几何部分的第一次笔记会主要介绍隐式曲面和显式曲面的特点,以及二者分类之下各自主要的几何表现形式。
首先我们来看一些例子:
在这里插入图片描述

水杯
在这里插入图片描述

水滴

在这里插入图片描述

建筑群

在见过这些各式各样的几何形体之后,为了进行更进一步的分类,我们首先把几何分为两大类别即隐式与显式。

1.隐式几何的特点

所谓隐式曲面指的是并不会告诉你任何点的信息,只会告诉你该曲面上所有点满足的关系。
比如说最典型的球的公式:

x2 + y2 +z2 = 1

我们都知道这是一个球的公式,但是除去一些我们已经知道形状的公式,其余的从公式上很难看出来这是一个什么形状.
一般地的我们会把隐式曲面的代数方程写作
f ( x , y , z ) = 0

该球体的f ( x , y , z ) =x 2+y2+z2 - 1

对于隐式方程来说因为没有给出任何点的信息,因此如何采样到曲面上具体的点是一个很难的问题,如下图这样一个例子:
在这里插入图片描述
不要说去找这上面的一个点了,我可以百分之一万的确定,在第一次看到这个公式时你都不知道这是个什么形状,

虽然不容易去找一个点,但是可以很好的判断一个点和几何的关系:
在这里插入图片描述

如果使用隐式曲面方程,将会十分容易的判断出一点与曲面的关系, 将这一点套进公式,如果等于0在几何上,小于0在几何内,大于0在几何外.

这是一种非常具有吸引力的特性(能够轻易的判定光线与物体是否相交)。

2.显式几何的特点

对于显式曲面来说是与隐式曲面相对应的,所有曲面的点被直接给出,或者可以通过映射关系直接得到,如下图:
在这里插入图片描述
虽然没有直接给出点的数据x,y,z,但是拥有u,v的取值范围以及从( u , v ) → ( x , y , z ) 的映射关系,那么只需要将所有的u,v代入自然就可求得x,y,z。

因此我们可以很轻松的得到曲面上的点,但是我们无法判断一个点与几何的关系.

Tips:区别隐式曲面与显示曲面的关键就在于是否可以直接表示出所有的点

具体的几种隐式曲面

1 代数曲面(Algebraic Surfaces)

在这里插入图片描述
如图所示,我们可以用数学公式来表示不同的几何图形,尤其是第三个,让我明白了原来图形学和数学里充满了爱.

但这种表达方式最大的缺点就是无法通过直接知道几何的形状,表达很不直观,但我们能知道一点与几何的关系.

但是对于更复杂的情况如何处理?
在这里插入图片描述

2 实体几何法(Constructive Solid Geometry)

在这里插入图片描述
从图我们就可以知道个大概了,就是将两个几何进行不同布尔运算,如并,交,差,从而得出新的组合图形.

通过这些操作可以得出各种更为复杂的几何:在这里插入图片描述
通过CSG的方法我们通过简单的几何构造出了复杂的几何,但是构造全靠人脑去想像…
(该种方法广泛存在于各类建模软件之中)

3 符号距离函数(Signed Distance Function)

除了对于几何的布尔操作,还可以通过距离函数来得到几何形体混合的效果,如下图:
在这里插入图片描述
如何得到这种blend的效果,就要从SDF即符号距离函数说起了(这里的符号是指距离可以有正有负),我们通过对sdf做blend从而得到一个新的几何.

首先对于符号距离函数来说本质上就是一种定义距离的函数。

可以看作是空间中一点到几何上一点的最小距离,这个距离可以是正是负,正代表在几何外,负代表在几何内.

如有空间一点到各个几何物体表面的最小距离,对几个距离做各种各样的运算操作最后得到的一个函数就是最终的距离函数了,举一个简单的例子:
在这里插入图片描述
对于这样一个二维平面的例子,定义空间中每一个点的SDF为该点到阴影区域右边界的垂直距离,在阴影内部为负,外部为正,因此对于A和B两种阴影来说的SDF分别如上图下半部分所示。有了SDF(A),SDF(B)之后对这两个距离函数选择性的进行一个blend也就是做一些运算得到最终的距离函数,这里采用最简单的SDF = SDF(A)+SDF(B)来举例来理解的直观一点,并不是所有的sdf都是用加法求得,其方法更负责.

最终得到的SDF为零的点的集合即为blend之后曲面,对该例子来说,就是两道阴影之间中点的一条线:

在这里插入图片描述
因此对于这个例子来说,具体实现是找出任一个点到两个几何体表面距离中的SDF,之后再通过一些数学操作将两个SDF进行BLEND,从而得到一个新的SDF,这个新的SDF = 0的点的集合就是物体的新表面.
(油管搜索Coding Adventure:Ray Marching,)
在这里插入图片描述

4 水平集(Level Set)

水平集的方法其实与SDF很像(像是SDF的一种特殊形式),也是找出函数值为0的地方作为曲线,但不像SDF会空间中的每一个点有一种严格的数学定义,而是对空间用一个个格子去近似一个函数,如下:

在这里插入图片描述
对该面内的每一个点利用已经定义好的格子值进行双线性插值就可以得到任意一点的函数值,根据双线性插值我们找出所有=0的点作为曲面。

该方法的好处是对于SDF,我们可以更加显示的区空间曲线的形状。该方法广泛的运用在医学成像和物理模拟之中:
在这里插入图片描述
在这里插入图片描述

5 分型几何(Fractals)

分型几何是指许许多多自相似的形体最终所组成的几何形状。就比如说我们知道世界上没有相同的雪花,我们知道雪花是一个六边形,放大之后会发现每一个边上又是一个六边形,再放大六边形边上的六边形边上又是六边形就这样无休止的循环下去,就想俄罗斯套娃一样…一个接一个
在这里插入图片描述

隐式曲面具有形式简单,轻易判断点与曲面关系等优点,但难以采样曲面点和模拟过于复杂的形状。

接下来看看显示曲面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值