Games101-课程9笔记
目录
重心坐标 :
重心坐标公式(已知三个顶点坐标)
重心坐标缺点
在一个高分辨率的墙上贴着低分辨率的纹理, 解决方法如下
图像插值算法:
①Nearest Interpolation(最近邻插法)
②Bilinear Interpolation(双线性插值)
③Bicubic Interpolation(双三次插值)
在一个低分辨率的墙上贴着高分辨率的纹理, 如下
解决方法:
①超采样 : 一个像素取多个采样点进行平均.
②Mipmap(多级渐远纹理)
Anisotropic Filtering(各向异性过滤)
EWA滤波
环境光照贴图
Spherical Environment Map
Cube Map
Bump mapping(凹凸贴图)
基本原理
如何计算经过凹凸后的法线位置?
二维世界
三维世界
Displacement mapping(位移贴图)
代价
目前解决方法: DirectX 提供了(动态曲面细分)
3D纹理
纹理可以记录一些已经计算好的东西
3维的纹理应用
第九节课 : 纹理的应用
重心坐标 :
在三角形ABC内任意一个点坐标都可以表示为ABC三个顶点坐标的线性组合. 线性组合就是任意搭配, 但是要符合系数相加 = 1(看上面公式)
α β γ都为正数 ,证明所求的点在三角形的平面内, 若三个数还符合相加为1 ,则证明该点就是三角形的重心坐标.
A顶点对应的三角形是AA
B顶点对应的三角形是AB
C顶点对应的三角形是AC
α/ β/ γ可以用这三个三角形面积求出(具体看上面公式)
当这个点是重心坐标时 : α/β/γ都是1/3 , 等面积分成三份
以下为重心坐标公式(已知三个顶点坐标) :
先求出重心坐标 , 再通过重心坐标求出α/ γ/ β
Va、Vb、Vc可以是位置、纹理坐标、颜色、法线、深度、材质属性
重心坐标缺点 : 从3维投影到2维的情况下 ,不能保证不变性 ,投影过后重心坐标发生变化.
解决方法 : 如果想找到3维空间中的重心坐标 ,应该在3维空间中取顶点坐标求出重心坐标 ,再进行插值操作 ,不能在投影到2维的时候求出重心坐标.
在一个高分辨率的墙上贴着低分辨率的纹理(纹理被拉大 ,uv值变小),相当于纹理比墙小. 纹理很小, 纹理需要拉大才能占满屏幕空间.
一个纹理上的像素 称为 纹理元素(纹素)
图像插值算法:
①Nearest(最近邻插法) ②Bilinear(双线性插值) ③Bicubic(双三次插值)
图片抗锯齿效果依次变好, 计算量依次加大.
1.Nearest Interpolation(最近邻插法) :
将待求图像各点的像素值设为源图像中与其最近的点, 算法优点在于简单、速度快.
2.Bilinear Interpolation(双线性插值):
将邻近的4个纹素 ,水平和竖直进行插值操作(共三次插值操作)
红色点(x , y) , 通过对周围四个纹素的插值计算 ,得出红色点(x , y)经过过渡的颜色是多少. 具体计算如下 :
3.Bicubic Interpolation(双三次插值) :
取周围的16个纹素, 在这里需要使用两个多项式插值三次函数,每个方向使用一个.
在一个低分辨率的墙上贴着高分辨率的纹理(纹理被拉小 ,uv值变大), 相当于纹理比墙大. 纹理很大, 覆盖了很多屏幕像素
当纹理较大时, 会看到近处有锯齿, 远处有摩尔纹
左: 正常 右: 被拉小的纹理映射
产生的原因是 :
近处的一个像素覆盖的纹理区域较小, 而远处的一个像素覆盖的纹理区域较大.
导致在采样覆盖点进行插值操作时, 出现了很大的变化.
解决方法:
①超采样 : 一个像素取多个采样点进行平均.
②Mipmap(多级渐远纹理) : Allowing(fast , approx , square) range queries
特征: 保持(快速,近似,方形) 范围查询
它们的应用场景是对象与相机之间的距离是可变的情况,随着对象离相机越来越远,对象的纹理在屏幕上比它实际的分辨率会更小,换句话说每个屏幕像素点包含不止一个对象的像素,纹理将不得不在缩小过滤的过程中不断缩小,这通常需要应用程序对多个纹理进行采样从而确定像素的颜色。当你需要运行时只为单个像素而要对整个纹理进行采样好像是个得不偿失的问题。
这也是mipmap的用武之地,应用程序可以根据对象与相机的距离在纹理链中的任何低分辨率的mipmap之间进行切换,而不是重复对单个纹理进行采样。
提高了缓存效率,降低了带宽,而我们只需要稍微增加原来纹理文件大小的1/3
每一层纹理像素都做除2处理, 卷积平均小一半.
minmap效果图 :
如何求出屏幕空间中的点(u , v)在纹理空间中的所占纹理像素大小?
找到点(u ,v)的相邻两个点 , 求出距离点(u , v)最远的一点的长度 , 以该长度为边长, 由点(u , v)作为中心 , 构成的一个四边形. (看下图公式)
如果该四边形覆盖纹理像素的大小为1*1, 原始纹理图大小为4*4, 则可以在最原始的图(Level 2)找对应的像素. 因为level 0 为4*4, level 1 为2*2 , 所以level 2图为1*1.
使用了minmap (分七层) 后, 下图可以看到基本还原 ,但是可以观察到颜色的渐变不够流畅, 因为在层与层之间存在较大的色差, 即纹理图除2处理跨度大, 所以我们引入level 1.2/level 1.5/ level1.8等等.
Level 1与level 2之间的level 1.5怎么算出 :
先对level 1和level 2 做 Bilinear Interpolation (双线性插值), 再对这两个求出的结果进行插值处理. 就可以得出level 1.5.
经过三线性插值得到 :(和双线性插值差别很大, 主要表现在颜色的过渡)
假设Supersamping (超采样)(512*512), 得到准确的结果.
Mipmap(多级渐远纹理) :
出现Overblur(过度模糊), 可以明显看到远处的细节糊掉.
为了解决Overblur的问题, 采用以下方法:
Anisotropic Filtering (各向异性过滤) : (轴对齐的各向异性探针)
效果图 :假设原图256*256
图像会被采样到256*128/ 128*256/ 64*128等等.
屏幕像素(左)分布到纹理图(右):
有些像素所占纹理图不是呈矩形的, 而是斜着的长方形, 正着的长方形.
各向异性过滤不会在每个方向上过滤相同的内容, 一个轴不必因为另一轴的网频而模糊,仍然避免了混叠.
缺点 : 对角各向异性的问题仍然无法解决, 例如一个像素覆盖纹理区域的圆形, 六边形等等.
EWA滤波
EWA滤波被广泛的认为是纹理过滤(texture filtering)算法中最好的算法之一。
效果图 :
环境光照贴图
1图:格子图 2图:flat shading 3图:phong shading
4,5图: 纹理贴图 6图: 反射
茶壶有一个环境光贴图(房子的环境光照射到茶壶上)
暂时不考虑点光源位置 , 也就是不考虑光照距离 , 只考虑光照方向
Spherical Environment Map:
把环境光照记录在一个球面上, 并且把它展开.
从下图看出 :这个方法导致, 球极点(例如北极)位置会出现扭曲现象
于是出现了一个解决方法 : Cube Map
把球对应的每个点对应到包围它的立方体上
这个方法有一个小问题: 计算量增大了一点, 因为每次要计算球上某一位置对应的立方体的哪一个位置, 但是非常快.
不过得到的平铺图片不会产生扭曲现象
纹理的另一个功能: Bump mapping(凹凸贴图)
基本原理: 在不改变物体几何形体的情况下, 给它一个贴图(记录相对高度), 因为高度发生变化, 导致其三角形法线或者像素法线发生变化, 令接受的光程度发生变化, 从而影响shading结果, 产生明暗对比, 人眼就会觉得是凹凸不平的效果. (其实三角形顶点并未产生任何变化)
例如下面左边的小图: 可以认为黑色区域代表高度为0, 白色区域代表高度为1
凹凸贴图 : 如何计算经过凹凸后的法线位置?
二维世界
① 原始表面贴图法线为(0,1)竖直向上, 经过凹凸贴图作用后, 法线发生了变化. 接下来计算变化后的法线:
② 利用差分方法先计算出变化后点的切线, 把切线逆时针旋转90°,使用旋转公式得出变化后的法线(-dp ,1 ).
三维世界
① 这里就不推导公式(比较复杂), 通过类比2D的方法得出 :点p的位置有两个不同方向的切线(u和v)
② 在三维中, 法线方向并不全是(0,0,1)竖直向上的, 而是射向不同的方向, 所以要给这个点设局部坐标. 在局部坐标中计算完凹凸贴图形成的新法线后, 再将其转换为世界坐标.
③ 一般直接使用公式即可 n = (-dp/du , -dp/dv , 1)
h()是高度,在法线贴图里高度则表示坐标(u,v)对应顶点的颜色(RGB值)
引入两个新概念 : 切线空间(TBN) 与法线贴图(dU,dV)
TBN表示以该顶点所在平面的法线作为z轴(N), 平面切线且垂直于z轴的向量为t, 另一条向量则用这两个向量叉积得出, 为b向量.形成一个坐标轴.
乘以TBN矩阵 : 从切线坐标转换到世界坐标
乘以TBN矩阵的逆 : 从世界坐标转换到切线坐标
Displacement mapping(位移贴图):
这里的三角形顶点是真的发生了位移变化, 效果明显比凹凸贴图要好, 但是有代价.
代价: 要求模型拥有很小的三角形, 三角形顶点变化速度跟得上位移纹理的位移速度.
目前解决方法: 要是我的模型本身几何形体三角形不够小, 不够细致, 但是我也想有位移贴图的效果, 那么在DirectX中就提供了(动态曲面细分)方法. 根据位移贴图的需要, 做三角形的细分.
3D纹理: 不局限在二维, 噪声化, 模型的每一个点都有一个解析式.
纹理可以记录一些已经计算好的东西
① 先算好Ambient occlusion(环境光遮蔽)
② 然后写进纹理图 (Texture map)里
③ 最后直接贴到模型上
3维的纹理: 应用于体渲染, 例如医院的核磁共振之类的.
Games101-课程9笔记相关推荐
- GAMES101课程学习笔记—Lec 14(2)~16:Ray Tracing(2) BRDF、渲染方程、全局光照、路径追踪
GAMES101课程学习笔记-Lec 14(2)~16:Ray Tracing(2) BRDF.渲染方程.全局光照.路径追踪 0 引入--辐射度量学概述 1 相关概念 1.1 Radiant Ener ...
- GAMES101课程学习笔记—Lec 02:Linear Algebra 线性代数回顾
GAMES101课程学习笔记-Lec 02:Linear Algebra 线性代数回顾 0 图形学的依赖学科 1 向量 1.1 点乘 1.2 叉乘 2 矩阵 本节课知识比较基础,大学课程里应该都学过, ...
- GAMES101课程学习笔记—Lec 19: Cameras, Lenses and Light Fields 相机、透镜、光场
GAMES101课程学习笔记-Lec 19: Cameras, Lenses and Light Fields 相机.透镜.光场 1 关于成像 2 相机 2.1 小孔成像 2.2 快门与传感器 2.3 ...
- Games101课程笔记_lecture20_color颜色
Games101课程笔记_lecture20_color颜色 1 light Field/Lumingraph 1 全光函数 2 光场 3 光场相机 2 颜色 1 光谱 2 颜色 1 人靠什么感知颜色 ...
- 台湾大学林轩田机器学习技法课程学习笔记4 -- Soft-Margin Support Vector Machine
红色石头的个人网站:redstonewill.com 上节课我们主要介绍了Kernel SVM.先将特征转换和计算内积这两个步骤合并起来,简化计算.提高计算速度,再用Dual SVM的求解方法来解决. ...
- 台湾大学林轩田机器学习技法课程学习笔记1 -- Linear Support Vector Machine
红色石头的个人网站:redstonewill.com 关于台湾大学林轩田老师的<机器学习基石>课程,我们已经总结了16节课的笔记.这里附上基石第一节课的博客地址: 台湾大学林轩田机器学习基 ...
- 台湾大学林轩田机器学习基石课程学习笔记13 -- Hazard of Overfitting
红色石头的个人网站:redstonewill.com 上节课我们主要介绍了非线性分类模型,通过非线性变换,将非线性模型映射到另一个空间,转换为线性模型,再来进行分类,分析了非线性变换可能会使计算复杂度 ...
- 资源 | Deeplearning.ai课程与笔记汇总
从接触机器学习就了解到Andrew Ng的机器学习课程,后来发现又出来深度学习课程,就开始在网易云课堂上学习deeplearning.ai的课程,Andrew 的课真是的把深入浅出.当然学习这些课程还 ...
- 干货|MIT线性代数课程精细笔记[第二课]
0 前言 MIT线性代数课程精细笔记[第一课]笔记见MIT线性代数课程精细笔记[第一课]. 该笔记是连载笔记,希望对大家有帮助. 1知识概要 这一节中我们介绍一下消元法,即是上一节中我们提到的&quo ...
- c语言课程笔记格式,C语言课程学习笔记.docx
C语言课程学习笔记 C语言基础语言排行榜C--java--objective-C进制:进制:进位机制.用普通的话讲,应该为人为的定义一种度量来标识一样东西.计算机常用的进制有:十进制.二进制.八进制和 ...
最新文章
- npm install 提示权限不足 Error: EPERM: operation not permitted, unlink XXX
- java 折线图_java折线图的数据写入方法
- Android 关于Handler
- python 多进程异常处理
- 初中毕业自考计算机专业难吗,初中学历自考本科难吗?初中毕业自考大专步骤有哪些?...
- waf可以查看post请求吗_WAF是如何被绕过的?
- Fib数模n的循环节
- 软件设计原则(六)迪米特法则 -Law of Demeter
- idea的setting界面怎么进_Mac版YY语音进入频道失败怎么破?
- 一场全能的开发者大会,来自助力开发者成功进阶的华为云
- SpringMVC集成shrio框架
- 花开花落,我们都很渺小
- http://cerc.tcs.uj.edu.pl/links/
- JDY-24M主机使用手册
- office表格怎么冻结前两行_怎样冻结表格前两行(excel2003中怎么冻结行列标题)
- 基于原生Wine6.0.2稳定版打补丁解决ukylin-wine图标显示异常和deepin-wine闪退的问题,Ubuntu运行QQ接近完美(附补丁)。
- 你不知道的HelloGitHub!
- java8 Stream 使用案例
- 【真相】ChatGPT和OpenAI的API KEY
- 戴隐形眼镜好吗 隐形眼镜能经常戴吗
热门文章
- npm ERR! could not determine executable to run
- ConcurrenHashMap源码(JDK1.7)
- 表格的下拉放大 ----------王朋
- 年薪 10 万的程序员,如何积累人生的第一个 100 万?
- Qt读写Excel--QXlsx插入图表5
- java中的nio是啥,java中的NIO
- mysql事件探查器_SQL2005事件探查器中的Reads数据很大是怎么回事?
- 水泥行业超低排放政策频发,企业如何完成超低排放改造?
- 运维工程师 主要是做什么的?
- 新猿木子李:0基础学python培训教程 Python操作Redis之有序集合