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