Illumination,Shading and Graphics Pipeline
Illumination,Shading and Graphics Pipeline
Edmend ZhangGames 101 Illumination,Shading and Graphics Pipeline
- Visibility / occlusion
- Z-buffering 深度缓存 深度缓冲
- Shading
- Illumination & Shading
- Graphics Pipeline
概念补充
半程向量
半程向量(Halfway Vector)是计算机图形学中的一个概念,通常用于光照计算,特别是在实现镜面反射(Specular Reflection)时。它是光源方向和观察方向的归一化中间向量。使用半程向量可以简化光照计算中的镜面反射部分,使计算更加高效和准确。
Painter’s Algorithm 画家算法
先画远处的 近处覆盖远处的
但是深度的定义较为困难 比如这个正方体 如果先画左边在华上面右上角便不会出现一条线
Z-Buffer 解决画家算法的问题
Depth Z buffer这张图 距离越近 颜色越深
Shading 着色
在绘画上 :引入明暗和颜色的不同
A Simple Shading Model (Bling-Phone Reflectance Model)
Specular highlights 高光 表面光滑
Diffuse reflection 漫反射
Ambient lighting 环境光照
Diffuse Reflection 漫反射
kd=1 表示这个点完全不吸收能量 kd=0 表示能量全部被吸收
漫反射和观测方向v没有任何关系
镜面反射 Specular Term (Blinn-Phone)
当镜面反射最理想的时候 反射光只有一个方向
当镜面反射不是那么完全的时候 反射光是镜面反射反射光的哪一个区域范围
高光项 是因为观察的方向和镜面反射的方向足够接近
我们也可以用镜面反射方向R和V进行计算 这样就成了Phong模型 Blinn-Phong是在这之上的改进
因为Blinn-phong只需要观察方向和入射方向算 但是phong模型需要算反射方向 计算量会比较大
这张图表示镜面反射和漫反射 我们只看镜面反射
当ks系数变大的时候 亮度会变大
当p(max的指数)变大的时候 我们可以看到越来越小的高光
Ambient Term 环境光
假设我们各个点接收到来自环境的光都是相同的 即为Ia
ka为环境光系数
环境光不讲究从哪个方向进来 跟l没有任何关系
不管从哪里看 得到的结果都应该是一样的 和观测方向没有任何关系 所以环境光是一个常数(仅在这个假设)
Bling-Phong Reflection Model
(Ambient)环境光是一个常数(仅在这个假设)
Diffuse 和观测角度无关 和光照方向 法线方向有关
着色率
Flat Shading
每个三角形求叉积 求出每个三角形的法线
Gouraud Shading
求每个顶点的发现 每个顶点进行着色 三角形内部的颜色通过插值进行计算
Phong Shading
每个像素进行着色
当模型变得足够复杂 简单的着色方法也能取得比较好的效果
Graphics (Real-time Rendering Pipeline)
两个Uniform 纹理 norm 顶点法线
每个像素都这么执行 不需要for循环
Texture Mapping
纹理无缝衔接算法
Interpolation Across Triangles:Barycentric Coordinates 重心坐标
我们已知 三角形顶点(u,v)如何知道是三角形内部点的坐标?
有一个特殊的点 重心坐标是三角形的重心 三角形的重心会把三角形分成均等的三分a, b, c
重心和重心坐标是两个东西
重心坐标 不能保证在投影下不变
不能在投影之后做
Applying Texture 实际应用
Texture Magnification 纹理放大 (if the texture is too small)
Bilinear interpolation 双线性插值
Bicubic 三次插值
Point Sampling Texture —— Problem (if the texture is too large)
会出现 Moire and Jaggies 走样
屏幕上像素大小各不相同
super sampling costly
Anti aliasing — Supersampling
Point Query Range
尝试避免采样 在任何一个区域 得到平均值
Mipmap
- fast
- approx
- square
总体加起来只是多了1/3存储量
如果分层比较强 我们可能会导致结果不连续 可以插值解决
三线性插值 (Mipmap trilinear sampling )
Mipmap 在远处会overblur
Anisotropic Filtering(Ripmap)(各向异性过滤) better 在各个方向上表现各不相同
Mipmap 实际上是做的对角线上的图片
Anisotropic Filtering实际上多了一些不均匀的水平和竖直方向的压缩
X 层数 层数越高 基本都会收敛到总存储的三倍
Uses of Texturing
In modern GPUs,Texture = memory + range query (filtering)
Environment Map
Light from the environment 纹理可以用来描述环境光 例如镜子的反射 (Spherical Environment Map)
假设光源只记录方向信息 默认无限远
描述整个球上的位置信息 并不是一个均匀的描述
可以通过一个立方体包围这个球记录成像 减少扭曲(cube map)
纹理可以做凹凸贴图(法线贴图)
可以定义任何一个点的相对高度 可以在物体基础表面沿着法线方向向上或向下移动
实际上 引起法线差异 给出一个假的法线 让人觉得有凹凸的结果
Bump Mapping 凹凸贴图
通过法线贴图 定义一个复杂的纹理 但并不会改变任何的几何信息
How to perturb the normal (in flatland)
How to perturb the normal (in 3D)
Displacement Mapping 位移贴图
More advanced
位移贴图真正的改变了物理位置 可从图的边缘部分看出
但是要求几何图形纹理足够细致
Directx 包含 动态曲面细分 可以先进行贴图 再看是否需要再细分面数做 Displacement Mapping