图形学梳理
基础线代知识
时至今日,各类工具使得人们不必再掌握全部的计算,相比计算,我想学习图形学需要更多几何直觉而不是计算方式。
向量
点乘、叉乘
矩阵
变换
模型、相机(视图)
投影(正交、透视)
视口
光栅化
采样
信号学
反走样
着色
画家算法、z-buffer
光照计算
光照模型:Phong
镜面反射出的光线与观察者视线的夹角。
改进的算法:入射与视线的半向量(归一化后的(入射 + 视线))与法线的夹角。
L = La + Ld + Ls = ka * Ia + kd * (I / r^2) * max(0, n dot l) + ks (I / r2) * max(0, n dot h) ^ p
k 为漫反射系数(颜色),I 为光照强度,r 为测试点距离光照中心的距离,n 为法向量,l 为入射向量,h 为半向量,p 越大,高光越小。
光照频率:面、顶点、像素(Phong)
Phong 英年早逝,实属可惜。
顶点法线:附近面加权平均,面的面积越大权越大。
面内的像素法线:重心坐标(下面讲)
实时渲染管线
一系列操作的过程叫做管线。
顶点 -> 顶点处理
-> 屏幕空间顶点 -> 三角处理
-> 屏幕空间三角 -> 光栅化
-> 图元 -> 图元处理
-> 着色图元 -> 帧缓冲操作
-> 图像(像素数组)
着色器(shader):在可编程管线中,负责处理着色的东西
纹理映射
重心坐标:(a, b, c) 满足以下条件: (x, y) = aA + bB + cC; a + b + c = 1;
若点在三角形内,需要所有数都为非负的。
插值
临近:寻找最近的纹理
双线性(Bilinear):取临近的四个进行线性插值
双立方(Bicubic):取临近的十六个进行三次插值
大尺寸纹理
会导致采样率不足,单像素对应的点过多
经典问题:点查询,范围查询问题(平均值)
Mipmap
Mipmap -> 快速,非准确,正方形的范围查询。
基本思想为提前进行多级的平均计算,增加的额外空间为 1/3。
- lv0 -> 128x
- lv1 -> 64x
- lv2 -> 32x
- lv3 -> 16x
- lv4 -> 8x
- lv5 -> 4x
- lv6 -> 2x
- lv7 -> 1x
总共有 log2 层,每层是上层的一半。
mipmap D 与 D+1 之间进行三线性插值(Trilinear):D 进行一次双线性,D + 1 进行一次,他们的结果进行一次。
mipmap 的问题:会出现 overblur,远处细节丢失
各向异性过滤
生成 Ripmap,允许对长条形区域进行查询
相比 mipmap 解决长条问题,但未解决斜着的问题。开销增加为 3x
EWA 过滤
几何
环境光(可以用纹理表达)
球形环境光
球形图 问题:展开会扭曲
立方图 球映射到包围他的立方体
法线贴图
调光照
位移贴图
调顶点