目录
1.Blinn-Phong 反射模型(经验模型):Ambient+Diffuse+Specular
1.1.2 光本质是能量,与接受面大小有关(Lambert's cosine law)
1.1.3 Lamberian (Diffuse)Shading:与视线方向无关
1.2 Specular Term(高光) (Blinn-Phong)
⭐1.2.2 半程向量:将视线与反射向量夹角 转换为 法线与半程向量的夹角
1.3 Ambient Term(环境光):constant
4.1 重心坐标(Interpolation Across Triangles: Barycentric Coordinates)
4.2 纹理放大(Texture Magnification) :纹理过小、过大
4.2.1 纹理过小:最近邻法(四舍五入像素位置到纹理位置,就是找他最近的texel)
4.2.2 纹理过小:双线性插值(取最近四个texel,水平、垂直线性插值,即双lerp)
In this course:The process of applying a material to an object.
0. 光照模型中的一些基本定义:法线、光线、视线、表面参数
在某一个特定的点上着色:
0.1 shading ≠ shadow
1.Blinn-Phong 反射模型(经验模型):Ambient+Diffuse+Specular
1.1 Diffuse Reflection(漫反射)
1.1.1 从各个方向看颜色相同
1.1.2 光本质是能量,与接受面大小有关(Lambert's cosine law)
1.1.3 Lamberian (Diffuse)Shading:与视线方向无关
1.2 Specular Term(高光) (Blinn-Phong)
1.系数(高光颜色)、光能量吸收
2.反射向量的计算比半程向量计算量大很多
3.指数p,决定视线与半程向量角度大小影响的亮度
1.2.1 视线与反射向量夹角越小亮度越大
⭐1.2.2 半程向量:将视线与反射向量夹角 转换为 法线与半程向量的夹角
1.2.3 cos指数p
1.3 Ambient Term(环境光):constant
1.跟实际光照方向没什么关系
2.跟视线方向没什么关系
基本上是一个常数,保证任何一个地方不是黑的
2.Shading Frequencies(着色频率)
⭐3.渲染管线(Real-time Rendering)
也可以看这篇博客:计算机图形学:渲染管线_老闫在努力的博客-CSDN博客
1.输入一堆空间中的点
2.三维空间中的点投影到二维平面上
3.这些点会形成三角形
4.但屏幕是离散的,所以要对其进行光栅化,并做一些深度测试
5.对像素着色
现代计算机图形学允许顶点和像素部分是可编程的
⭐4.纹理映射:不同点不同位置有不同的属性
希望有一种方法,能够定义物体中某一个点的属性,不同位置有不同的属性
在纹理上定义一个坐标系,称为UV坐标系,其中一般定义
三维表面上的点,实际上展开就是一张二维平面图:
4.1 重心坐标(Interpolation Across Triangles: Barycentric Coordinates)
4.1.0 为什么?需要什么?怎么做?:插值!
4.1.1 ![(x,y)=\alpha A+\beta B+\gamma C \rightarrow (\alpha+\beta+\gamma=1)](https://latex.csdn.net/eq?%28x%2Cy%29%3D%5Calpha%20A+%5Cbeta%20B+%5Cgamma%20C%20%5Crightarrow%20%28%5Calpha+%5Cbeta+%5Cgamma%3D1%29)
伪代码实现:
- 对每个像素点(中心):
- 利用重心坐标计算UV坐标
- 根据UV坐标查询texture颜色
- 把颜色设置为反射系数kd
4.2 纹理放大(Texture Magnification) :纹理过小、过大
纹理分辨率小于屏幕分辨率,则在映射时,会出现多个pixel出现在一个texel附近:
红色点为像素点。此时有如下解法:
4.2.1 纹理过小:最近邻法(四舍五入像素位置到纹理位置,就是找他最近的texel)
4.2.2 纹理过小:双线性插值(取最近四个texel,水平、垂直线性插值,即双lerp)
纹理在红点处(pixel)映射的值是多少?
⭐4.2.3 纹理过大: MipMap
首先明确一点:有一张格子的纹理贴在这张“无线延申”的平面上,可以看到近大远小,这意味着远处点的pixel覆盖了更多的texel。若仍采用之前的采样方法,则会产生锯齿。
近处像素覆盖的纹理较小,远处较大。这告诉我们屏幕中不同像素覆盖的纹理区域大小是不同的。
首先想一下之前的抗锯齿方法:MSAA,假设买个像素取512个点采样,并作平均:
但是天下没有免费的午餐,而且MSAA这份午餐实在太贵了。由此我们想一想产生走样的原理:采样的频率与信号(纹理)变化的频率不同,在这个例子中,就是一个pixel内有很多个texel,这么多的texel(如此高的texel信号频率),却只进行了一次采样(一个pixel),那必然会导致走样。
采样会引起走样,那如果我们不采样呢?我立刻可以知道这个平均值是多少?
这里先前引入一个问题:点查询和范围查询
点查询就是我们之前提到的双线性插值等方法,范围查询则是:我们不做采样,给定一个范围,我立刻就可以知道范围的平均值。
MipMap:渲染之前提前把纹理处理一下,使得可以进行范围查询, 生成很多MipMap,存储为原空间的4/3