Shading 遮罩 7~9课笔记
第七课笔记
可见性问题
z-buffer 深度缓存算法
frame buffer 存颜色值
depth buffer 存深度z
本课假设z为正数,越小越近
for(三角形集合)
for(三角形内的点)
if(z < z_buf[x,y])
frame_buf[x,y] = rgb;
z_buf[x,y] = z;
z-buffer处理不了透明物体
shading 着色:对不同物体应用不同材质
lllumination 照明
pipeline 管道
blinn-phone reflectance model 着色模型
高光(镜面反射
漫反射
间接光照
shading point
viewer direction v 观察方向
surface normal n 法线,垂直于物体表面
lightdirection l 光照方向
surface parameters 各种属性
cosa = l*n (l和n都是单位向量)
漫反射:
L = k(I/r^2)max(0,nl)
L漫反射光
k漫反射系数(明暗,可以理解为吸收光照的程度,如1为不吸收光照,显示白色
r光源到着色点距离
I/r^2 有多少能量到达着色点
nl n点乘l,为cos(n,l),不能小于0
与观察方向无关
管线:从场景到图的一系列过程
将点投影到屏幕上,形成多个三角形,光栅化(采样-深度测试),着色,输出。
Shader:能在硬件上执行的语言
在GPU进行
像素着色器GLSL
纹理映射:可以理解为把一张二维图蒙到三维物体表面
纹理用来定义着色时的点的属性
第八课笔记
着色频率
渲染管线
高光:观察方向和镜面反射方向相近
h半成向量,用到了平行四边形法则与归一化
specular term 镜面反射
Blinn-Phong模型:环境光+漫反射+高光
Ambient+Diffuse+Specular

不考虑有多少能量被镜面吸收
用nh夹角而不用镜面反射方向,因为h好算
夹角系数p能缩小夹角,避免出现太大的高光
k越小,高光越亮
p越大,高光越小

Ambient Term 环境光照
L = kI
L 反射环境光
k ambient coefficient 环境系数
I 环境光的强度
shading frequencies 着色频率
顶点法线:相邻的面的法线取平均,可加权
三种着色:面(flah),点(),像素(phone)
gouraud shading:对每一个顶点(Vertex)着色
第九课笔记
barycentric coordinates 重心坐标:三角形内插值,每一个点都有自己的重心坐标
interpolate 插值:插值就是根据已知数据点(条件),来预测未知数据点值的方法,通过顶点属性给三角形内部赋值
重心坐标(\(\alpha\), \(\beta\), \(\gamma\))
\(\alpha\), \(\beta\), \(\gamma\) 非负
三角形三顶点ABC
则三角形内任意一点都能用以下公式求出
(x,y) = \(\alpha\)A + \(\beta\)B + \(\gamma\)C
\(\alpha\) + \(\beta\) + \(\gamma\) = 1
重心坐标可以通过面积求
点P到三顶点分别组合,会形成PAB、PAC、PBC
\(\alpha\) = PAB/(PAB+PAC+PBC)
\(\beta\) = PBC/(PAB+PAC+PBC)
\(\gamma\) = PAC/(PAB+PAC+PBC)

通过面积可以推出更简便的公式

三角形ABC的重心坐标 = (1/3, 1/3, 1/3)
投影状态不能保证重心坐标不变,因此要逆变换回投影之前的空间里,做好深度插值再变回去
texture 纹理
对于每个采样点(x, y) => 插值出来的纹理映射(u, v) => 纹理上通过(u, v)查询得所需color属性
纹理定义的漫反射系数
texel 纹理像素,纹理元素,纹理上的像素,纹素
pixel 画面上的像素
如果纹理过小,就可能出现太多pixel对应单个texel,导致画面模糊,可以用双线性插值优化。
如果纹理过大,就可能出现一个pixel对应太多texel,会出现摩尔纹、锯齿等走样现象,
走样:信号变化过快,采样频率跟不上,需要更高的采样频率,也可以避免采样,直接求平均值(算法里的点/范围查询问题)。
bilinear 双线性插值:对于一个非整数的坐标,如何得到值
线性插值公式 lerp(x, v\(_{0}\), v\(_{1}\)) = v\(_{0}\)+x(v\(_{1}\)+v\(_{0}\))
两次水平插值,一次竖直插值,可得范围内平滑的属性
方向也可以反过来,先竖直后水平

bicubic 三线性插值:取周围16块
超采样:取区域内所有点的平均值
mipmap: fast 快速、apporx 近似值、square 只能求正方形区域
mipmap 以原图为第0层,每层都合并四个像素求和,直到1×1,通过等比数列级数求和可知,第1层到第n层比起原图多了三分之一存储空间
一个使用mipmap的套娃算法,能规避画面远处走样
大致步骤:
- 从第0层开始,将画面分为四等分
- 其中三分为第0层,剩下一分再划为四等分
- 其中三分为第1层,剩下一分再划为四等分
- 重复上述步骤,每次递增一层,直到像素不可再分
通过此算法求出的图的大小 = 原图大小的4/3
实际上不一定是四等分,看使用情况
mipmap 每层之间可用双线性插值进行平衡过渡,即分别在两层上做一次双线性插值,再在层与层之间,用之前的结果进行一次线性插值,合起来是三线性插值
三线性插值十分泛用,它可以得到连续的表达,开销小
mipmap 会导致overblur(远处画面取大片纹理像素的平均值,导致模糊)
解决方法:
- anisotropic filtering 各向异性过滤,可对矩形区域进行一次快速查询,不限制在正方形。各向异性:在各个方向上的表现不同。开销几乎在显存上。
- EWA filtering ,将不规则形状用很多圆形覆盖,多次查询,比af精度高,但开销是原本的三倍

浙公网安备 33010602011771号