Illumination,Shading and Graphics Pipeline

Games 101 Illumination,Shading and Graphics Pipeline

  • Visibility / occlusion
  1. Z-buffering 深度缓存 深度缓冲
  • Shading
  1. Illumination & Shading
  2. Graphics Pipeline

概念补充

半程向量

半程向量(Halfway Vector)是计算机图形学中的一个概念,通常用于光照计算,特别是在实现镜面反射(Specular Reflection)时。它是光源方向和观察方向的归一化中间向量。使用半程向量可以简化光照计算中的镜面反射部分,使计算更加高效和准确。

image-20240718150927997

Painter’s Algorithm 画家算法

先画远处的 近处覆盖远处的

image-20240718111805891

但是深度的定义较为困难 比如这个正方体 如果先画左边在华上面右上角便不会出现一条线

image-20240718112041317

Z-Buffer 解决画家算法的问题

image-20240718112532500 image-20240718113046906

Depth Z buffer这张图 距离越近 颜色越深

image-20240718120507320 image-20240718141008532

Shading 着色

在绘画上 :引入明暗和颜色的不同

A Simple Shading Model (Bling-Phone Reflectance Model)

image-20240718141911039

Specular highlights 高光 表面光滑

Diffuse reflection 漫反射

Ambient lighting 环境光照

Diffuse Reflection 漫反射

image-20240718142819783 image-20240718142913959 image-20240718143456778

kd=1 表示这个点完全不吸收能量 kd=0 表示能量全部被吸收

漫反射和观测方向v没有任何关系

镜面反射 Specular Term (Blinn-Phone)

当镜面反射最理想的时候 反射光只有一个方向

当镜面反射不是那么完全的时候 反射光是镜面反射反射光的哪一个区域范围

高光项 是因为观察的方向和镜面反射的方向足够接近

image-20240718150138639 image-20240718151711358

我们也可以用镜面反射方向R和V进行计算 这样就成了Phong模型 Blinn-Phong是在这之上的改进

因为Blinn-phong只需要观察方向和入射方向算 但是phong模型需要算反射方向 计算量会比较大

image-20240718152246175

这张图表示镜面反射和漫反射 我们只看镜面反射

当ks系数变大的时候 亮度会变大

当p(max的指数)变大的时候 我们可以看到越来越小的高光

Ambient Term 环境光

image-20240718152615379

假设我们各个点接收到来自环境的光都是相同的 即为Ia

ka为环境光系数

环境光不讲究从哪个方向进来 跟l没有任何关系

不管从哪里看 得到的结果都应该是一样的 和观测方向没有任何关系 所以环境光是一个常数(仅在这个假设)

Bling-Phong Reflection Model

image-20240718153054657

(Ambient)环境光是一个常数(仅在这个假设)

Diffuse 和观测角度无关 和光照方向 法线方向有关

着色率

Flat Shading

image-20240718154618512

每个三角形求叉积 求出每个三角形的法线

Gouraud Shading

image-20240718164429807

求每个顶点的发现 每个顶点进行着色 三角形内部的颜色通过插值进行计算

Phong Shading

image-20240718164814200

每个像素进行着色

image-20240718164948789

当模型变得足够复杂 简单的着色方法也能取得比较好的效果

Graphics (Real-time Rendering Pipeline)

image-20240718165645104 image-20240718170655156

两个Uniform 纹理 norm 顶点法线

每个像素都这么执行 不需要for循环

Texture Mapping

image-20240718181854985

纹理无缝衔接算法

Interpolation Across Triangles:Barycentric Coordinates 重心坐标

我们已知 三角形顶点(u,v)如何知道是三角形内部点的坐标?

image-20240718184038314 image-20240718184348627 image-20240718184804731

有一个特殊的点 重心坐标是三角形的重心 三角形的重心会把三角形分成均等的三分a, b, c

重心和重心坐标是两个东西

image-20240718184856947

重心坐标 不能保证在投影下不变

不能在投影之后做

Applying Texture 实际应用

Texture Magnification 纹理放大 (if the texture is too small)

Bilinear interpolation 双线性插值

image-20240718191110831

Bicubic 三次插值

Point Sampling Texture —— Problem (if the texture is too large)

会出现 Moire and Jaggies 走样

image-20240719113930469

屏幕上像素大小各不相同

super sampling costly

Anti aliasing — Supersampling

Point Query Range

尝试避免采样 在任何一个区域 得到平均值

Mipmap

  • fast
  • approx
  • square
image-20240719115121411

总体加起来只是多了1/3存储量

image-20240719124702549

如果分层比较强 我们可能会导致结果不连续 可以插值解决

image-20240719175245162

三线性插值 (Mipmap trilinear sampling )

Mipmap 在远处会overblur

Anisotropic Filtering(Ripmap)(各向异性过滤) better 在各个方向上表现各不相同

image-20240719180205518

Mipmap 实际上是做的对角线上的图片

Anisotropic Filtering实际上多了一些不均匀的水平和竖直方向的压缩

image-20240719180906500 image-20240719181139371

X 层数 层数越高 基本都会收敛到总存储的三倍

Uses of Texturing

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

Environment Map

Light from the environment 纹理可以用来描述环境光 例如镜子的反射 (Spherical Environment Map)

假设光源只记录方向信息 默认无限远

image-20240719182706791

描述整个球上的位置信息 并不是一个均匀的描述

可以通过一个立方体包围这个球记录成像 减少扭曲(cube map)

纹理可以做凹凸贴图(法线贴图)

可以定义任何一个点的相对高度 可以在物体基础表面沿着法线方向向上或向下移动

实际上 引起法线差异 给出一个假的法线 让人觉得有凹凸的结果

Bump Mapping 凹凸贴图

通过法线贴图 定义一个复杂的纹理 但并不会改变任何的几何信息

How to perturb the normal (in flatland)

image-20240722103142406

How to perturb the normal (in 3D)

image-20240722104927412

Displacement Mapping 位移贴图

More advanced

image-20240722105605612

位移贴图真正的改变了物理位置 可从图的边缘部分看出

但是要求几何图形纹理足够细致

Directx 包含 动态曲面细分 可以先进行贴图 再看是否需要再细分面数做 Displacement Mapping

3D Procedural Noice + Soild Modeling

image-20240722110048836

Provide Precomputed Shading

3D textures and volume Rendering