Geometry Introduction

引言

GAMES101 现代图形学入门是由闫令琪老师教授。今天我们结束上一节纹理的应用,并开启一个新话题:几何,介绍几何的应用场景以及常用的表示方法。

Applications of textures

Many, Many Uses for Texturing

In modern GPUs, texture = memory + range query (filtering)

  • General method to bring data to fragment calculations
  • Many applications
  • Environment lighting
  • Store microgeometry
  • Procedural textures
  • Solid modeling
  • Volume rendering
  • ……

纹理其实就是一张图,本身可以做各种各样的操作,在现代GPU中我们可以理解为内存+滤波。从这个角度出发,纹理就没有必要限制在图像上,而是作为数据可以做不同类型的查询。

Environment Map

环境光照是最直接的应用,也有人叫做环境光映射或者环境贴图。比如说大家站在一个房间里面,可以往四面八方看,来自四面八方都会有光可以看到物体。任何方向不管直接光照、光源还是反射任何方向大家都可以看到光,那如果我把任何一个方向来的光都记录下来,这就是我们说的环境贴图/环境光照。

纹理在描述环境光自然而然有一个假设:我们认为环境光来自无限远处,没有实际的深度意义,也就是说我们直接记录一个不同的方向即可。我们可以用纹理描述环境光长什么样,然后用环境光去渲染一个物体,这就比一个点光源要好很多,至于如何计算我们之后再说。

Environmental Lighting

回到应用上,如果我们可以把环境光描述在某一个纹理上,那我们就可以用它来渲染一些东西。如图所示我可以把环境光就存储在球上,并且像展开一个地球仪表面一样展成世界地图,这就是我们要提到的Spherical Environment Map。

Spherical Environment Map

假设我有一个镜面球,认为有一个鱼眼形状的摄像机或者多拍几张图合成为全景图,把整个环境光记录在球上并且展开。

Spherical Map — Problem

如果把整个环境光记录在球上并且展开会有一个问题:扭曲。可以发现上面的树木会很大程度向中间的扭曲,这个可以从世界地图想象出来,描述整个球上不同位置是做到了,但不是一个均匀的描述,靠近极点的区域会出现扭曲的情况。

Cube Map

A vector maps to cube point along that direction. The cube is textured with 6 square texture maps.

人们发现了一个办法去解决它。假设我还是用一个球的表面任意一个位置记录来自任何地方的光线,但现在我认为球有一个包围盒立方体把这个球包住,那我原来记录在球上的位置转移到立方体的六个面上:

Textures can affect shading!

纹理还有一个非常重要的应用叫做凹凸贴图。纹理之前是替换漫反射项的颜色,它可以做其他事情,可以定义任何不同位置任何不同属性,比如这里我们可以定义在一个表面上任意一个点它的相对高度。

右图这个橘子如果用三角形表示可能比较繁琐,但如果应用凹凸贴图就可以定义相对高度,也就是说我们在不把几何形体变复杂的情况下可以通过应用一个复杂的纹理从而定义任何一个点它的相对高度,相对高度发生变化法线发生变化,着色的结果也就发生变化,人们看到不同明暗对比一定程度上就是因为法线发生变化产生着色上的明暗对比,我们就认为这儿会有凹凸的东西。

Bump Mapping

Adding surface detail without adding more triangles

  • Perturb surface normal per pixel (for shading computations only)
  • “Height shift” per texel defined by a texture
  • How to modify normal vector?

通过法线贴图我可以定义一个复杂的纹理,但我并不去改变任何的几何信息。然后我把任何一个像素的法线都通过高度的改变做一个扰动。

我们来看一个例子,首先黑色的线就是原本的光滑的物体表面,然后我们应用了法线的凹凸贴图告诉我们相对高度该如何变化,对于任何一个点p它实际上会被凹凸贴图认为变为n。通过凹凸贴图我们可以得到黄色的法线,而原先的法线应该是黑色的。那我们如何去真正计算法线如何变化呢?

How to perturb the normal (in flatland)

  • Original surface normal n(p) = (0, 1)
  • Derivative at p is dp = c * [h(p+1) - h(p)]
  • Perturbed normal is then n(p) = (-dp, 1).normalized()

我们先把问题简单化,不考虑二维的贴图三维的空间,我们考虑的就是一个变化的一维的函数。假设任何一个点原本是一个平面,蓝线是由凹凸贴图定义出来的,原本的法线是 (0,1)。

如果我定义一个凹凸贴图,我在任何一个点处我如何计算凹凸贴图的梯度、曲线的切线或是函数的导数/微分?用相邻两个点的高度差$h(p+1)-h(p)$除以两者的间隔1,引入一个常数定义凹凸贴图的影响$c$(纹理定义的法线对真实物体发现的影响系数/程度)做一个简单的缩放。

现在我用可以在任意一个点求出这个曲线的切线,如何从切线变到法线呢?在例子中可以看出法线就是垂直于切线的一个方向,假设水平方向移动1,竖直方向移动$dp$,那么切线对应的向量就是$(1,dp)$,把切线逆时针旋转90度就是法线,法线立刻求出来是$(-dp,1)$,最后做一个归一化,思路理清:我们用凹凸贴图去定义切线,然后我通过切线算法线。

How to perturb the normal (in 3D)

  • Original surface normal n(p) = (0, 0, 1)
  • Derivatives at p are
    • dp/du = c1 * [h(u+1) - h(u)]
    • dp/dv = c2 * [h(v+1) - h(v)]
  • Perturbed normal is n = (-dp/du, -dp/dv, 1).normalized()
  • Note that this is in local coordinate! More will be elaborated in FAQ of HW3

在实际情况下我们有一个二维贴图,假设局部坐标系中原本的法线是$(0,0,1)$,同样道理我们仍然可以求出不同方向的梯度(类似于偏导数)。这样的话我们就可以把切线方向写出来,旋转90度算出法线$(-dp/du,-dp/dv,1)$。

Textures can affect shading!

Displacement mapping — a more advanced approach

  • Uses the same texture as in bumping mapping
  • Actually moves the vertices

位移贴图是一种更现代化的方式。凹凸贴图和位移贴图定义都是用一个纹理定义任何一个点该有的相对高度差别,所以它们输入完全一样,用的完全相同的纹理,只不过位移贴图实际上会把不同的顶点和三角形面真的做一个位置的移动,而不是说通过这个位置的移动换算成法线的变化做一个假的顶点移动。

从结果上来看位移贴图显然要更好,但是它的代价是要求这个模型的三角形足够细,因为它改变的是三角形顶点的位置,模型要跟上纹理要求的变化速度,回到了之前采样的问题。动态曲面细分不需要一开始有一个足够细致的模型,根据需要做它的细分。

3D Procedural Noise + Solid Modeling

刚才纹理的应用都是二维的,还是把它当图来看。其实纹理没必要限制在二维,可以定义三维的纹理,比如图中的球砍一半可以看到内部是什么,而我们原本说纹理是贴在物体表面,切开应该什么也看不见,这里实际定义了空间中任何一点它的值。

Provide Precomputed Shading

纹理还可以记录之前已经算好的信息。比如这里环境光遮蔽可以实时算出投影的一部分阴影,但我们算Shading完全考虑不到这部分信息,之后会讲到。其实我们可以计算好之后写入一张纹理的图,到时候我们再把纹理贴上,最后着色的结果乘以计算好的环境光遮蔽纹理依然可以得到这个结果,这就非常快了。

3D Textures and Volume Rendering

三维的纹理广泛应用在体积的渲染里,之前的光照模型各种各样的东西只考虑一个表面,而事实上像在医学里面会有核磁共振成像或者CT成像扫描人体组织的某一个部分,返回三维空间的信息。这些信息记录下来渲染得到一个结果,关于体渲染之后我们详细来讨论,我们也可以把它当做一个纹理。

Introduction to Geometry

Examples of Geometry

我们从最简单的几何形体来看,这里是一堆玻璃杯子,它们有不同的曲线,如何得到这些各种各样的几何呢?

这张图可以看到车子不同的部件,车身是一个非常光滑的曲面。关于曲面我们应当如何去定义它?在生活中我们看不到三角形,基本上是一个非常光滑的过渡,这就说明世界上真的存在这样光滑的曲面的,在图形学里面我们如何去描述这些几何的形体?

这是一些相对复杂的东西,大家可以看到齿轮、发动机以及各种各样的叶片,这些应当如何去描述它?各个不同的部件大小各不相同,位置摆放都是怎么去设计的?这些都是几何里需要研究的问题。

这里是布料的几何形体,很显然不是简单的表面,因为它是透明的。纤维通过扭曲形成股,不同的股扭曲形成线团,线团再编成不同的形状,是一个复杂分级结构。所以说布料和衣服的建模之后会提及,这当然也是一种几何。

水滴滴到水面就是上面水花四溅的情况,这是模拟的一个部分。如果我们要在图形学重现这么一个事情,需要模拟任意一个时刻它有什么样的力,并且下一个时刻应该形成这种水花飞溅的东西,这些流体如何用几何去描述?

一个城市会更为复杂,它的东西非常多,在图形学的表述上自然而然带来两个问题:

  1. 如何存储
  2. 如何渲染

如果看过《超能陆战队》可以回忆一下,电影中大量充斥着这种整个城市的远景,为了做渲染电影团队做了很多这方面的研究,包括远处如何简化几何模型以及如何利用光线之间的连续性我们之后会说。复杂的几何会造成非常复杂的情况。

复杂的几何在很近的距离就可以看到,比如这只狗它身上的毛形成了一簇一簇的形状,这些毛发该如何表现?所以即使在非常近距离,几何也可以无限复杂。

所以几何绝对不是一件容易的事情,不是所有东西都拿三角形面表示的事情。

Many Ways to Represent Geometry

图形学里我们有不同的方式表示不同的几何,包括隐式几何(Implict)和显式几何(Explicit)。

“Implicit” Representations of Geometry

隐式表示实际上不会告诉你任何空间中的一个点在什么具体位置,但我会告诉这些点满足的特定关系。比如单位球的隐式表示就是三维空间中任何满足$x^2+y^2+z^2=1$的点,而球的显式表示有很多不同的方法。

Implicit Surface – Sampling Can Be Hard

Some tasks are hard with implicit representations

比如说这里看到这样一个隐式几何的表示方式:$f(x,y,z)=(2-\sqrt{x^2+y^2})^2+z^2-1$,这些点被认为在面上。但如果问哪些点满足这么一个式子,这是一个相对困难的事情,很难看出来是一个圆环。

Implicit Surface – Inside/Outside Tests Easy

Implicit representations make some tasks easy

隐式表示当然也有好处,它能判断任何一个点在不在这个面上。我们只需要把这个点拿进这个函数里得到一个值,如果为0则在表面上;结果为负数则在内部;正数在外部。

“Explicit” Representations of Geometry

All points are given directly or via parameter mapping.

相对的图形学上就有另一种方法:显式表达,最简单的理解就是有一个模型比如我们之前用的三角形面就是典型的显式表达方法,把面上这些点真的表达出来。

还有一种通过参数映射的显式方法,比如上图如果定义空间$u、v$,上面有任意一个点用坐标$u、v$表示,并且我可以定义任何一个点都可以映射到空间中的某一个点。也就是说我可以定义一个函数输入的是$u、v$,输出的是$x、y、z$,把所有的$u、v$都走一遍就可以得到所有的$x、y、z$,平面上的所有点都看一遍然后就可以知道对应到三维空间中是什么形状,该例中是马鞍面。

Explicit Surface – Sampling Is Easy

该例中定义了一个函数,它把$u$和$v$这两个参数映射到空间中实际的点$x、y、z$。对于显式表示来说只要把所有的$u、v$都找一遍就知道空间中的形状。

Explicit Surface – Inside/Outside Test Hard

对于显式表面来说,我想判断任何一个点现在在不在表面上会变的非常困难,不好判断是否在表面的里外。我们根据需要选择显式表示或者隐式表示。

No “Best” Representation – Geometry is Hard!

“I hate meshes. I cannot believe how hard this is. Geometry is hard.” — David Baraff Senior Research Scientist Pixar Animation Studios

Various representations of Geometry

Many Implicit Representations in Graphics

Algebraic Surfaces (Implicit)

Surface is zero set of a polynomial in x, y, z

最简单直接的办法是用数学公式去表述,它有一个严重的问题就是不直观:球写的还算明白,圆环就已经稍微难一点了,右边单看公式完全看不出来这个隐式表面是什么。通过算数方法直接表述当然是个简单方法,对于复杂的情况诸如图上的奶牛又该如何用公式表示呢?

Constructive Solid Geometry (Implicit)

几何的隐式表示可以不只是通过代数方法来描述,人们管这个叫做CSG,通过对一系列基本的几何做基本的运算定义新的几何。$A$和$B$圆柱和球都是基本几何形体,其布尔运算就是定义并集、交集以及差集,通过这些简单的运算和基础的几何就可以形成复杂的几何,下图的几何体就是这样拼接出来的。

这个操作得到了非常广泛的应用,各种各样不同的建模软件都支持这样一种方法。通过这种方法,我自然可以把简单的几何变成复杂的几何,而这种几何只通过它们的相互关系而不必知道各个点在什么位置,最后还可以写成表达式的形式。

Distance Functions (Implicit)

Instead of Booleans, gradually blend surfaces together using

Distance functions:

giving minimum distance (could be signed distance) from anywhere to object

我们定义一个距离函数的东西,用它来表述几何。对于任何一个几何,我都不去直接描述它的表面,我去描述任何一个点到这个表面的最近距离。图中这两个球逐渐靠近,发生形状上的融合形成新的球,它们的拓扑结构也会发生变化,这件事情就是通过几何距离函数做融合形成的结果。

An Example: Blending (linear interp.) a moving boundary

这是一个应用距离函数的例子。输入和输出是两张不同的图我们认为它表示某种几何的边界,假设有一个物体挡住了你能看到的视口整个左边的1/3,然后这个物体经过一些移动之后挡住了左边的2/3,我希望求出这个物体从左到右移动的中间状态。

如果我们考虑这两个不同的图,做一个简单线性的融合会得到一个叠加的图,它并不能得到表述所谓的运动信息。我想要得到它准确的运动过程,左边一半是黑的,右边一半是白的。我们先求出有向的距离函数,可以看到A中靠近它的值比较小,远离它的值比较大,所以距离函数是这样一个变化方式,B也是同理。将这两幅图做一个融合操作,新的SDF函数根据正负关系最后基准0一定是在正中央。

Blending Distance Functions (Implicit)

Can blend any two distance functions d1, d2:

两个物体的融合其实是在平面空间中分别把它们对应的距离函数求出来,再恢复成原本的一张图。

Scene of Pure Distance Functions

之前的蜗牛就是距离函数表示的应用,它没有实际的几何形体,它的几何表示都是隐式表示,几何之间圆滑的过渡中间就是靠距离函数融合起来,表示能力非常强。

Level Set Methods (Also implicit)

那么我们既然提到距离函数,我们说距离函数融合出来之后得到一个函数最后如何恢复成表面呢?很简单,我只需要把距离函数对应0的位置全找出来。对于一些特定的情况比如距离函数不太适合写成解析式,没有问题,只要距离函数能通过某种方法表述出来就可以。

图中是水平集方法,它的想法和距离函数完全一样,仅仅是它的函数表述写在这个格子上,只需要找到中间某一些地方是0就可以把整个函数试图表述的表面提取出来。这个概念在地理上得到了广泛的应用,也就是等高线,就是为了描述一个函数在不同的位置有相同的值,对于水平集来说我们关注$f(x)=0$。

Level Sets from Medical Data (CT, MRI, etc.)

Level sets encode, e.g., constant tissue density

水平集没有人说一定定义在二维上,也可以在三维上,这就和我们的纹理联系上了。如果我们有一个三维的纹理表述人体的不同位置它的密度,那我们从三维的信息去提取出物体的表面。

Level Sets in Physical Simulation

Level set encodes distance to air-liquid boundary

大家模拟水花四溅的过程,它也可以通过水平集或距离函数的方式把水滴与水滴融合在一起,并且提取出融合之后的表面。

Fractals (Implicit)

Exhibit self-similarity, detail at all scales

“Language” for describing natural phenomena Hard to control shape!

几何还有一种特殊的描述方法:分形。分形是指自相似的意思,和计算机中的递归是一个道理。有很多人在研究分形的几何表示,但分形在图形学上应用不是特别多。

Implicit Representations - Pros & Cons

Pros:

  • compact description (e.g., a function)
  • certain queries easy (inside object, distance to surface)
  • good for ray-to-surface intersection (more later)
  • for simple shapes, exact description / no sampling error
  • easy to handle changes in topology (e.g., fluid)

Cons:

  • difficult to model complex shapes

GAMES101_Lecture_10