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 有多少能量到达着色点
n
l n点乘l,为cos(n,l),不能小于0
与观察方向无关


管线:从场景到图的一系列过程
将点投影到屏幕上,形成多个三角形,光栅化(采样-深度测试),着色,输出。


Shader:能在硬件上执行的语言
在GPU进行


像素着色器GLSL


纹理映射:可以理解为把一张二维图蒙到三维物体表面


纹理用来定义着色时的点的属性


第八课笔记


着色频率
渲染管线


高光:观察方向和镜面反射方向相近


h半成向量,用到了平行四边形法则与归一化


specular term 镜面反射


Blinn-Phong模型:环境光+漫反射+高光
Ambient+Diffuse+Specular

image-20210301134833447


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

image-20210301134939126


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)

image-20210301134753211


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

image-20210301134506723


三角形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}\))

两次水平插值,一次竖直插值,可得范围内平滑的属性

方向也可以反过来,先竖直后水平

image-20210301143116583


bicubic 三线性插值:取周围16块


超采样:取区域内所有点的平均值


mipmap: fast 快速、apporx 近似值、square 只能求正方形区域

mipmap 以原图为第0层,每层都合并四个像素求和,直到1×1,通过等比数列级数求和可知,第1层到第n层比起原图多了三分之一存储空间


一个使用mipmap的套娃算法,能规避画面远处走样

大致步骤:

  1. 从第0层开始,将画面分为四等分
  2. 其中三分为第0层,剩下一分再划为四等分
  3. 其中三分为第1层,剩下一分再划为四等分
  4. 重复上述步骤,每次递增一层,直到像素不可再分

通过此算法求出的图的大小 = 原图大小的4/3

实际上不一定是四等分,看使用情况


mipmap 每层之间可用双线性插值进行平衡过渡,即分别在两层上做一次双线性插值,再在层与层之间,用之前的结果进行一次线性插值,合起来是三线性插值

三线性插值十分泛用,它可以得到连续的表达,开销小


mipmap 会导致overblur(远处画面取大片纹理像素的平均值,导致模糊)

解决方法:

  1. anisotropic filtering 各向异性过滤,可对矩形区域进行一次快速查询,不限制在正方形。各向异性:在各个方向上的表现不同。开销几乎在显存上。
  2. EWA filtering ,将不规则形状用很多圆形覆盖,多次查询,比af精度高,但开销是原本的三倍
posted @ 2021-03-01 13:38  一语子  阅读(159)  评论(0)    收藏  举报