Shanding
画家算法:深度排序,O(nlogn),然后逐个像素光栅化
**Z-Buffer(非常实用重要):**现在广用的算法,深度缓存。生成两张图,一个就是最后的结果,一个就是深度图,如下图。
深度缓存的工作原理:
着色:
Blinng-Phong着色模型
n:法线
光线和表面的夹角,决定了亮度和能量的多少,接受到的能量和光线方向和法线方向夹角的余弦成正比
关于上图的r出能量,可以做一个简单的下图推导

高光:观察方向和镜面反射方向接近时,就会有高光
ks就是高光
但是高光一般都是一个点,cos余弦曲线比较陡峭,如下图、在blinn-phong模型中,一般都是100-200.
环境光照:环境光是一个常数,La=kaIa
如果把漫反射项,高光,环境光加起来,就是整个blinn-phong模型
着色频率:
左,每个三角形求出来着色
中,在任意一个顶点法线做一次着色
右,每一个像素做着色
逐顶点的法线:相邻面的法线求平均。
**逐像素法线:**需要用到重心坐标
图形管线(实时渲染)。
把所有东西加起来:
- 空间中三维的点
- 投影在屏幕上
- 形成三角形
- 光栅化
- 着色
- 根据深度打在屏幕上
着色OPENGL,写一些shader(每个顶点或者像素会执行一次,是通用的,每一个像素都会自动执行,如果写的是顶点那就是顶点着色器,如果是写的像素那就是像素着色器)。像素着色器opengl如下:
纹理映射把模型表面展开后纹理上的坐标系
重心坐标:做三角形内的插值,三角形三个点不同的属性,这个时候就需要三角形内进行一个平滑的过渡,中心坐标的意思如下图:
重心坐标是通过面积比求出来的。
纹理的若干问题:
纹理太小了,就是纹理不够清晰,任选一个点不是整数像素,水平方向一个插值,竖直方向一个插值,双线性插值。bilinear
bicubic取周围16个
如果简单的用上述方法,会如下图出现走样
为什么会出现走样,因为像素近处覆盖很小,远处覆盖很大,用双线性插值是不合理的
点查询和范围查询(不做采样)
Mipmap:允许做范围查询,快,不准,方形)
什么是mipmap?从一张图生成一系列图
mipmap又叫图像金字塔,仅仅多了三分之一的存储
纹理
用纹理去描写环境光
法线贴图=凹凸贴图
通过发现贴图,可以定义复杂的纹理而不用改变建模,通过发现凹凸贴图可以改变相对高度,从而改变发现
几何:
几个的隐式标识:CSG:可以通过简单的几何变成复杂的几何
DF:距离函数,表示几何(最近的点到表面的最近距离)
SDF(有向距离函数)
显示几何:点云,不考虑他是表面,就是一个一个点组成的
贝塞尔曲线:给任意多的一系列控制点,如三个控制点,会生成二次贝塞尔曲线,