- 3dMax 导出一个模型文件包含内容:顶点坐标,法线,边的关系,
- model 模型
- 空间中有了一个摄像机 Model 通过变换可以让摄像机放在原点 View
- 三维空间的模型变换到屏幕上 Projection
- 通过采样进行光栅化 Rasterization
下一步着色
1 Shading: Definition 着色定义
引入明暗与不同颜色的过程称为着色
在本课中定义是给物体应用材质的过程2 Blinn-Phong Reflectance Model 一种简单的着色模型
关于Blinn-Phong的着色模型
先前我在 LearnOpenGL学习笔记—光照02:Lighting Basis/Advanced Lighting 中对其概念进行过阐述
当时也是用了闫老师的PPT和视频作为讲解材料,并做了简单实现(点光源为例)
所以此处不再赘述3 Shading Frequencies 着色频率
3.1 平面着色
- 平面着色
3.2 顶点着色
- 顶点着色
每个顶点做一次Shading,对颜色值插值
3.3 像素着色
- 像素着色
这里的Phong Shading指的是一种着色频率,之前说的Blinn-Phong是一种着色模型
三角形三个顶点求出法线,在三角形内部的像素,对法线值做插值,对每个像素做Shading3.4 对比
- 几何形体足够复杂的情况下,用简单的Shading方法也可以达到好的效果
3.5 顶点法线求法
- 顶点法线求法
内部平滑过渡的法线做法——Barycentric interpolation 重心插值
法线记得归一化
4 Graphics (Real-time Rendering)Pipeline 实时渲染管线
关于这一部分
到现在的知识的学习已经可以让我们去学习API了(如OpenGL, DirectX)
在这里推荐:ShaderToy,在这个网站,我们只需要关注着色器怎么写
当下的实时渲染
5 Texture Mapping 纹理映射
关于纹理映射的内容
我在 LearnOpenGL学习笔记—入门05:Texture 做过阐述
- PPT中的示意图很好表示这个映射过程
- 纹理本身设计可以无缝衔接:tilable,一种设计无缝衔接纹理的方法:Wang Tiling
6 Barycentric Coordinates 重心坐标插值
- 重心坐标插值
利用面积的计算确定系数
利用坐标的计算确定系数
- 利用中心坐标插值的方法,投影前后的重心坐标可能会变化,所以需要在对应的阶段计算对应的重心坐标来做插值,不能随意复用
- 进行插值
7 Applying Textures 纹理应用
- 点上计算得到插值出来的UV坐标,然后在纹理上查询,之后根据需要应用(图中为简单应用,直接赋值)
8 Texture Magnification 纹理放大
纹理分辨率太小,多个pixel(像素)映射到了同一个texel(纹理像素)
- 解决方法→插值
8.1 Bilinear Interpolation 双线性插值
双线性插值:水平插值+竖直插值
lerp为linear Interpolation的缩写
下图为最近的四个点插值
- 找到目标点周围四点
红点离四个点左下角的垂直与水平距离
8.2 Bicubic Interpolation 双三次插值
取周围16个点也是做竖直和水平的插值
每次用4个,做三次的插值,不是用线性的差值
双向三次插值运算量大,但是效果好
关于这个方法可以看看这位大神的介绍
双三次插值算法(bicubic interpolation)与图形学和计算方法的关系
双三次插值(BiCubic插值)
9 纹理过大的问题
- 纹理过大时,一个pixel对应了多个texel → 采样频率不足导致 摩尔纹+锯齿(走样)
远处地平面的一个像素,对应一个大块的纹理,简单的点采样不行
解决:
超采样,提高采样频率,可是太浪费
采样会引起走样,那么我们不采样,只得到一定范围的平均值。
这是点查询与范围查询的问题
- 点查询,给出一个点,得到一个点的值
范围查询,不采样,给出一个区域,得到区域的(平均)值
9.1 Mipmap 多级渐远纹理
Mipmap 多级渐远纹理
可以进行快速的范围查询,但是是近似的,并且只有方形
关于Mipmap的内容
我在 LearnOpenGL学习笔记—入门05:Texture 中的 纹理环绕方式/纹理过滤 这一部分做过阐述
- 以下为PPT中的示意图
关于计算Mipmap的示意图
首先我们要把像素覆盖的区域找出来,进行近似
考虑一个像素时,也考虑上周围的点
然后把它们的中心一起映射到UV上计算距离
于是可以用距离为边长的 虚线的正方形框 来近似 映射过来不规则的四边形
层数D约为相邻pixel的映射uv之间的距离取2的对数
D的作用举例
如果区域的大小是1×1 D=0 那么在最原始的等级的Mipmap上找
如果区域的大小是4×4 D=2 那么在第二等级的Mipmap上找,也就是在第二等级上,这个4×4会变成1×1,然后去第二等级上去查这个像素的值,那就是这个区域的平均值
单纯只是整数层之间,会有不连续的缝隙
所以如果不是整数层,那么查前后两层,进行双线性插值,然后再进行一次插值
也就是三线性插值,得到结果
9.2 Anisotropic Filtering 各向异性过滤
Mipmap会把远处的细节都模糊掉
因为它只能查询方块的区域内,以及插值毕竟只是近似
-
解决三线性插值的方法就是各向异性过滤
方块的近似有时候太过勉强,如下图纹理映射后奇形怪状的
Mipmap做的是方块的 也就是下图左上角的图,但是不方正的压缩做不了各向异性过滤允许我们对长条的区域进行范围查询,但是对于斜着的区域,不行
生成各向异性过滤的图(Ripmaps)的开销是原本的三倍
各向异性的意思是,在不同的方向上它的表现各不相同
各向异性的几X是压缩几倍,也就是从左上角往右下角多几层EWA过滤,把任意不规则的形状拆成很多不同的圆形,去覆盖这个形状
多次查询自然可以覆盖,但是耗时大10 Application of Texture 各种纹理贴图
之前的内容中,我们可以得到,给出一个网格,然后做各种shading接下来在shading的基础上,我们可以贴上各种贴图
有许多种类的纹理贴图
10.1 Environment Map 环境光贴图
把来自各个方向的光照记录下来,假设环境光来自无限远,只记录方向
也就是说纹理可以用来表示环境光
Spherical Environment Map 球面环境映射
可以类比成地球仪
存在拉伸和扭曲问题Cube Map 立方体贴图
把环境光记录在立方体的表面上
问题也有,之前球面可以很方便得到某一方向的光照,但是现在还要判断这个方向记在立方体的哪一个面上10.2 Bump Mapping 凹凸贴图
Bump Mapping的Texture记录了高度移动,不改变几何信息
贴图作出人为的假的法线,由此得到假的着色效果,产生凹凸效果
通过自定义的高度差,逐像素地扰动法线方向,法线方向一改,着色结果就会发生变化计算法线方向:求出切线以后找到垂直方向
UV情况下的法线算法
10.3 Displacement mapping 位移贴图
与凹凸贴图的输入相同,但是位移贴图真正改变几何信息,对顶点做位移
相比上更逼真,因为凹凸贴图在边界上会露馅
位移贴图要求模型的三角形足够细致,且运算量更高
DirectX有Dynamic的插值法,根据需要对模型做插值,看情况把模型变得细致10.4 Procedural textures 程序纹理
三维的纹理,定义了空间中任意一点的值
对于这种纹理,并没有真正生成这个纹理的图
它们定义了三维空间的噪声函数,函数经过各种处理,可以变成需要的样子
10.5 Precomputed Shading 预计算着色
用空间算时间,先计算好环境光遮蔽贴图,然后再把纹理贴上
10.6 Solid modeling & Volume rendering
三维纹理广泛应用到体渲染之中
比如核磁共振等扫描后,得到体积的信息,通过这些信息进行渲染,得到结果