概念:对不同物体应用不同材质
llumination
shading着色
Blinn-Phong reflectance model
Diffuse Reflection 漫反射
光打到了shading point上然后光线四面八方均匀散射
光源会根据光源传播的距离进行一定的能量衰减
按球的表面积来算,吸收的能量和光的角度有关系
max(0,n`1)是因为当它是负数的时候就没有物理意义了
漫反射和观察的视角完全没有关系!
Specular Term 高光
观察的方向和镜面反射(v和R)接近的时候可以看到高光(死去的物理突然开始攻击我
好聪明啊,直接拿半程向量是否接近法线来算,简化了计算
为啥有个指数p呢↑↓缩小高光范围!(一般这个指数是100~200)
上图中ks是亮度
Ambient Term 环境光
假设任何一个点接收到的来自环境的光永远相同
所有的光合起来↓:
环境光(常数颜色)
漫反射光(和观测角度无关,和光照和法线角度有关)
高光
着色频率 Shading Frequencies
flat shading
对面
Gouraud shading
对顶点
Phong shading
对每一个像素
Per-Vertex normal Vectors 逐顶点法线
Per-Pixel Normal Vectors 逐像素法线
***记得归一化!把法线变成单位向量!
Graphics Pipeline 实时渲染管线
Vertex Processing
MVP变换
Rasterization
Fragment Processing
Shader Programs着色器
定义顶点/像素/片段进行操作
推荐网站:shadertoy
Shadertoy BETA
Texture Mapping 纹理映射
三维物体的表面(Surfaces)是2D的!
把三维空间中,实际上是二维的物体表面贴上一张图
纹理坐标系(u,v)
一般默认u和v的范围都是0~1
纹理也可以在一个场景里多次重复使用!
Interpolation 插值
一般的计算都是在三角形顶点上,而插值决定了点与点之间的平滑过渡
Barycentric coordinates 重心坐标
三角形平面内任何一个点都可以理解为ABC三个坐标的线性组合
注意 ,在三角形内α,β和γ满足>=0,如果α+β+γ=1只能说这个点跟这个三角形同平面
e.g A的重心坐标是(1,0,0)
α,β和γ也可以通过面积求出
重心把三角形分成了等面积的三个三角形
有种梦回高中的感觉
要在投影前做插值!!!!!因为投影后坐标可能会变!如果已经三维了那么请使用逆变换
Texture queries
Diffuse Color
Point sampling texture 问题
Texture Magnification 纹理放大
纹理上的像素 --texel(纹理元素,纹素)
解决方法:找到非整数坐标的值
Bilinear Interpolation 双线性插值
之前刚好写了篇博客讲怎么算的(感觉其实图形学和cv之间还挺多交集的)双线性插值以及计算_Scabbards_的博客-CSDN博客
这里2d的是取临近周围四个
Application of textures
Bicubic取临近周围十六个
纹理缩小
思路1:走样虽然可以用很多采样点解决,但是计算量太大了
思路2:避免采样
Point Query 点查询vs Range Query 范围查询
Mipmap 多级贴图
用于在近似的范围内做范围查询
先把纹理在渲染之前处理一遍
mipmap 在cv里面叫image pyramid
这些层加起来也只是原存储量的4/3
mipmap原理:放大后的像素可以在相同大小的mipmap上面查询那个位置的平均值,在log2L层上面查询
可视化↓
解决层数之间区别的方法:插值
Trilinear Interpolation 三线性插值
两个双线性插值后面再将两次结果做一次双线性插值
ambient terms
缺点:overblur(过于模糊)
Anisotropic Filtering 各向异性过滤
可以查询原始图像的矩形区域而非限定在正方形区域
对于上图中斜着的也有过滤方法:
EWA
拆成很多圆形去覆盖不规则形状