Pixel World

it's better be burning out than to fade away.

计算机图形学(七):阴影

All the variety, all the charm, all the beauty of life is made up of light and shadow - Tolstoy

阴影对于表达场景真实感极其重要,因为它能够提供物体在空间中的相对位置关系,使物体看起来不是漂浮在空中的。本章将重点介绍计算阴影理论以及在光栅化中实时阴影算法。

shadows

《古墓丽影-暗影》 2018

之前介绍$blinn-Phong\;Model$光照模型是局部的,仅考虑光线 着色点 视线三个因素,不考虑其它物体对于当前着色点的影响,例如遮蔽,阴影等,而现实情况是,光照是及其复杂的,需要考虑周围物体对着色点的影响(间接光照),而在传统的局部着色(直接光照)中很难实现准确的表达,往往需要通过其它技术近似的模拟,今天介绍的$shadow\;Mapping$就是其中之一。一种在光栅化成像中实现阴影的技术。

$Shadow\;Mapping$

它是一种图像空间($Image-Space$)算法。核心思想就是:那么一个着色点既可以被摄像机看到也可以被光源看到,那么该点不在阴影里。如果一个着色点在阴影里,那么摄像机可以看到,光源是看不到的。

传统的$Shadow\;Mapping$只能处理点光源,这样的阴影都有明显的边界和锯齿,一个着色点要么在阴影里,要么不在,缺少了中间柔和的过渡。这种阴影我们称之为硬阴影

阅读全文 »

计算机图形学(六):反射方程与渲染方程

双向反射分布函数($BRDF$)

描述

$BRDF$全称$Bidirectional\;Reflectance\;Distribution\;Function$。$BRDF$是描述了物体表面对能量反射分布特性的函数。假设物体表面单位面积$dA$接收到来自$W_i$方向光线的能量,用$E$来表示,这些能量$E$到达物体表面后,会向各个不同的方向反射(每个方向反射的能量不同),$BRDF$函数就是描述这束能量向特定方向$W_r$的反射占比。

BRDF

  • Differential irradiance incoming:$dE(w_i) = L(w_i)\cos\theta_i{d}w_i$
  • Differential intensity exiting: $dL_r(w_r)$

正式定义

单位面积$dA$从单位立体角$w_i$接收到的$irradiance$,会被如何反射到各个不同的方向上去。更通俗点来说就是BRDF描述的是单位面积接收单位立体角$w_i$的能量的反射分布(比例)。反射比例依赖于出射方向($w_r$)。$BRDF$描述了光与物体表面是如何相互作用的。即物体的材质属性由$BRDF$定义。

BRDF

阅读全文 »

计算机图形学(五):纹理应用-下

上一章介绍了凹凸贴图,凹凸贴图可以提升粗糙mesh细节表现,凹凸贴图其实没有改变表面的几何结构,仅仅是通过法线的扰动影响了着色而已,因此产生的问题就是,在特定角度观察或者观察物体边缘或阴影时,问题就暴露出来了,这是因为没有考虑高程带来的视差和遮挡。因为mesh信息没有提供对应的深度变化,在$z-buffer$深度测试时,不会对被遮挡的顶点做深度测试,因此不会产生应有的自遮挡现象。

bummmap

视差贴图 ($Parallax\;Mapping$)

视差贴图解决了凹凸贴图带来的问题(凹凸贴图没有考虑自遮挡问题),如下图当我们从相机观察到$P$点时,由于高程的存在,我们应该看到的是$p_ideal$,但实际上在凹凸贴图用的是p点的着色信息,所以看起来不够真实:

bummmap

2001年,$Kaneko$引入了视差贴图的概念,并对其进行了改进并由$Welsh$普及。 视差是指当观察者移动时,对象彼此相对移动。 随着观察者的移动,凹凸应该看起来有高度。 视差映射的关键思想是采用通过实时检查像素的高度来有根据地猜测应该在像素中看到什么(遮蔽现象)。

$Parallax\;Mapping$所需要的信息通常存储在一张高度图($heightfield\;Texture$)中。当观察物体表面某一着色点时,首先会根据纹理查询该点对应的高度值,然后基于这个高度值和观察角度计算出一个偏移量$offset$,这个偏移量实际上就是$p$点的偏移量,即我们实际上应该看到的像素点$p_{adj}$,而不是$p$点。如上右图所示,所做的事情就是:根据$p$点的高程,以及 $v$的方向,对$p$点偏移一段距离到达$p_{adj}$,以接近$p_{ideal}$

$p_{adj} = p + \dfrac{h*v_{tb}}{v_n}$

阅读全文 »

计算机图形学(四):纹理应用-上

在计算机图形学中,纹理贴图是使用图像、函数或其他数据源来改变物体表面外观的技术。例如,可以将一张砖墙贴图应用到一个多边形上,而不用对砖墙的几何形状进行精确建模。通过这种方式将图像和物体表面结合起来,可以在建模、存储空间和速度方面节省很多资源。当然纹理不仅仅用于改变物体表面漫反射颜色,纹理本质上是一个数据集,可以用来存储任何我们需要的数据,因此在各方面都得到了广泛的应用.本文将介绍MaterialMap、AlphaMap、BumpMap、NormalMap、ReliefMap、DisplacementMap、ParallaxMap、TexturedLight、ShadowMap、EnvironmentMap。
我们将以上纹理贴图的应用划分为6个大类:

  • 控制着色信息
  • 控制片元透明度
  • 改变顶点法线
  • 改变表面结构
  • 阴影贴图
  • 环境贴图

控制着色信息

根据$Blinn-phong\;Model$可知,物体表面着色信息有以下因子来控制:

blinn-phong

$L = L_a+L_d+L_s = K_aI_a + K_d\dfrac{I}{r^2}max(0, \hat{n}\cdot\hat{l}) + K_s\dfrac{I}{r^2}max(0, \hat{n}\cdot\hat{h})^p$

符号 解释
$K_a$ 物体表面环境光吸收率
$I_a$ 环境光强度
$\dfrac{I}{r^2}$ 到达物体表面的光线
$K_d$ 漫反射系数
$\hat{n}$ 着色点法线
$\hat{l}$ 光线单位向量
$K_s$ 高光系数
$p$ 高光衰减因子

可以看到有许多可以调节的参数来控制像素的着色表现。虽然可以赋予顶点更多的属性来改变这些参数,但是要做到亚三角形的细节程度,就需要使用各种纹理,对每个片元的着色参数进行调节,这些纹理映射方法统称为材质映射($Material\;Map$)。

阅读全文 »

计算机图形学(三):纹理映射

纹理管线($The\;Texture\;Pipeline$)

纹理映射 ($Texture Mapping$) 是一种将物体空间坐标点转化为纹理坐标,进而从纹理上获取对应纹素值,以增强着色细节的方法。

纹理管线($The\;Texture\;Pipeline$), 也就是单个纹理应用到纹理贴图的详细过程,其中每一个步骤均可以被用户灵活控制。

纹理映射步骤

一个砖墙的纹理管线处理过程。

纹理映射步骤

假设拥有三维模型空间到二维纹理空间的映射关系,只需要将每个顶点的颜色信息存储在二维纹理贴图上,在进行光照计算时根据映射关系查询每个顶点的颜色信息。所有点计算完后,就好像整个纹理被贴到了物体表面一样。但是如何建立这种映射关系呢?接下来介绍两种方式。

投影映射-从物体坐标系到参数空间($Projector\;and\;Mapping$)

阅读全文 »

计算机图形学(二):着色

渲染过程本质可以上分解为两个步骤:可见性测试和着色。光栅化和光线追踪本质上都是用于解决可见性问题。本章我们将介绍渲染过程的第二部分:着色。着色是一个庞大的主题。一些用于着色的技术在数学上也很复杂。本章我们将学习最基本的着色模型: $Blinn-Phong\;Reflectance\;Model$

$blinn-Phong\;Reflectance\;Model$

当我们观察一个物体时,可以明显的将物体的视觉表现分为三类:

  • 高光:表现很亮的部分,并且会随着视角的变化而变化
  • 漫反射部分:颜色变化不明显,表示物体本身的颜色或者diffuse颜色。(物体表面吸收了部分光线,反射出的未被吸收的部分)
  • 环境光:未被光照直接照亮的部分,模拟间接光照。在布林冯模型中简化为常量。这也是为什么布林冯模型被称为经验模型的原因。计算精确的间接光照需要$RayTracing$。

blinn-phong

布林冯光照模型是一个经验模型。整体思想就是按照这三部分来建模的。布林冯光照模型是一个直接光照模型(或者叫局部光照/局部性),不考虑间接光照,即不考虑周围物体反射的光线对其产生的影响。着色权重仅考虑光源。(阴影及SSAO需要多个pass处理)

定义光照参数

要计算物体表面着色点光照结果,需要定义一些基本的参数。

阅读全文 »

计算机图形学(一):辐射度量学

辐射度量学($Radiometry$)

辐射度量学是基于物理光照的基础,是基于几何光学来定义的,提供了精准的关于光的各种物理量,光与物体表面的作用,光线传播方法的定义等。辐射度量学是反射方程、渲染方程的基础。

Irradiance

1.辐射能量($Radiant\;energy$)

在辐射度量学中最基本的单位是辐射能量,表示为$Q$,单位是$J(焦耳)$,辐射能量$Q$以辐射的形式发射,传播或接收的能量。每个光子都携带一定的能量,这个能量正比于它的频率:

$Q = hv$

其中$h = 6.62620\times (10^{-34})J$.光子的频率(或者说能量)影响着光子与物体表面的交互,更重要的是,它影响着光与感应器之间的作用,使不同频率的光被察觉为不同的颜色。

2.辐射通量($Radiant\;flux$)

阅读全文 »

图形学的数学基础(十五):贝塞尔曲线

贝塞尔曲线($Bézier\;curve$)

用一系列控制点定义的曲线,如下图所示:曲线由四个控制点定义(三阶贝塞尔曲线),从$P_0$开始,沿着$P_0-P_1$切线方向行进,结束时沿着
$P_2-P_3$方向,结束于$P_3$点。

贝塞尔曲线

参数方程-$de\;Casteljau\;Algorithm$

首先考虑由三个控制点组成的二次贝塞尔曲线( $quadratic\;Bézier$):

贝塞尔曲线

假设有一颗沿着曲线运动的小球,当$t = 0$,球体在$b_0$点,当$t = 1$,球体在$b_1$点 定义曲线关于时间$t$的参数方程,实质上就是求在任意时间$t$($0<=t<=1$),球体的位置。这就是$de\;Casteljau$算法的核心思想,将曲线方程转换成了求一个点位置。

求解步骤:

阅读全文 »

图形学的数学基础(十四):插值

线性插值($Linear\;Interpolation$)

在图形学领域插值是一项广泛应用的技术,多数时候,数据是在规则网格上生成的(值写在 2D 或 3D 网格的顶点位置)或在一条线上(在 1D 情况下),但是程序需要计算任意一点的值。如果采样点刚好落在网格顶点处,那么可以读取数值直接使用,但是如果采样点落在其他地方,考虑到那里并没有存储数值,我们需要基于周围顶点计算数值。这种技术称为插值,因为其关键思想是“插值”,通过固定网格顶点的现有值计算网格上其他任意位置的值。

在二维中这种技术叫双线性插值,与之对应的三维插值称为三线性插值。“线性插值”是一种类似于以下形式的方程:

$a(1-t) +bt\;\;\;with\; 0 <=t\;<=\;1$

其他形式的线性插值都是以此为基础的。

线性插值

插值技术通常用于图像处理(例如上采样/下采样)。 三维空间也可以使用3D或2D网格(纹理可以看作2D网格),例如流体模拟、体积渲染、纹理映射和辐照度缓存等等,无论何时涉及网格,通常也需要插值技术。

双线性插值($Bilinear\;Interpolation$)

阅读全文 »

图形学的数学基础(十三):立体角

介绍

立体角,常用字母$\Omega$表示,是一个物体对特定点在三维空间中的角度表示,是平面角在三维空间中的扩展。因此,立体角是单位球面上的一块面积,这和“平面角是单位圆上的一段弧长”类似。

平面角

平面角等于张角对应圆上的弧长除以圆的半径,即:

平面角

$\theta = \dfrac{l}{r}$

而圆的周长等于$2\pi{r}$,因此完整圆
对应的角度为:

$\dfrac{2\pi{r}}{r} = 2\pi\;\;radians$

阅读全文 »
0%