欢迎光临散文网 会员登陆 & 注册

Games101-lecture 09 着色

2023-01-15 22:42 作者:云长梧  | 我要投稿

上一讲简单介绍了插值:

即已知三角形的三个顶点的纹理坐标uv,如何知道三角形内部的任意一点的uv,这就需要用到插值

插值通俗来讲就是已知三角形的三个顶点各自的属性,将这些属性在三角形内部做一个平滑处理

        属性可以有:纹理坐标、颜色、法线

(这个可以解释Unity Shader 入门精要中的逐顶点光照为何会呈现棱角现象)

逐顶点高光处有棱角现象,不平滑

这一讲将上一讲的着色讲完,有时间再讲阴影的部分

1.重心坐标--插值     2.研究纹理贴图    3.纹理其他应用

一、重心坐标

    重心坐标定义在一个三角形上面,即用来计算插值,三角形内一点x,y可以用三个顶点A,B,C表示:

在这个三角形A、B、C顶点形成的平面内任意一点 (x,y) 都可以表示成三个顶点A、B、C它们坐标的线性组合(即图上的式子)

如果三个系数都是非负的,那这个点在△ABC内,否则这个点就是在△ABC所在平面上

线性组合式子的应用
任意三角形内部一点的重心坐标用面积比例求得
三角形自己的重心

用这个重心去连接A、B、C可以得到三个等面积的三角形,从而重心的重心坐标为(1/3,1/3,1/3)

注意:重心和重心坐标是有区别的

推导式子--已知A、B、C以及重心的坐标,求重心的重心坐标:

推导式子(不用记,只要知道可以推导出来就行)

知道了重心坐标怎么求之后,就可以对三角形内部进行插值

三角形任意一点用重心坐标来求得其相应的属性

但是投影后的重心坐标可能会不一样,所以如果要在三维三角形内插值,要用三维的坐标

然后再将值对应到二维空间上去

二、应用纹理--怎样将纹理实际运用在渲染中

    屏幕上的任何一个采样点(通常为采样点中心),通过所在三角形的顶点们和重心坐标进行插值映射出采样点的纹理坐标,然后去纹理上查询一下uv的值对应的颜色,然后将颜色赋给漫反射系数--漫反射的颜色

简单纹理映射算法

三、纹理变换(对纹理进行放大或缩小)

1.纹理放大

纹理放大

任何一个点,找到它纹理上的坐标,如果这个位置不是整数,我们应该如何处理?

Nearest邻近值是对纹理坐标做一个简单的四舍五入的处理,用纹理坐标周围的很多像素合成一个像素(如:3*3,5*5),但缺点是会有锯齿,倒挺适合做像素游戏

Nearest:图中红点纹理坐标不为整数,它的值为离他最近的整数点黑点的值

如果要变成中间或右边图的样子--有点模糊,但得到的结果稍微连续点

Bilinear双线性插值是利用周围邻近的四个点进行插值,如下四图所示

(s,t)范围为【0,1】

Bicubic是用周围16个点进行插值得到

这三者的区别可以去视频上看,Bilinear和Bicubic的区别可以用女孩眼睛的轮廓观察出

2.纹理缩小---比纹理放大多的是要对采样范围进行查询

像素缩小会发现远处产生摩尔纹,近处产生锯齿-----即走样

jaggies 锯齿      Moire 摩尔纹

近处的一个像素覆盖的纹理范围小,远处的一个像素覆盖了很大的纹理范围,所以远处还用中心点代表很大的纹理范围的像素是不对的

解决方法:远处的像素能更多地采样周围的样本

每个像素用512个采样点

lecture 6 讲述了走样产生的原因:信号变化速度过快(高频率),采样速度跟不上信号变换速度,从而发生走样

翻译:如果纹理过大,一个采样范围过大,但只以采样中心点代替这一范围的纹理,从而发生走样(一个像素承载很多信息称为高频信息变化)

一个像素内,它有非常高频的信号,要想尽量不走样,就要使用更高频的采样方法,这就是为什么一个采样范围要许多的采样点来做到超采样的方法

但如果不想超采样呢,然后又能立刻知道这个采样范围的平均值是多少?

                                                                                                       --mipmap多级渐远纹理

知道采样范围平均值这个问题是一个算法问题,无论在数据结构、计算几何等很多领域上都运用这个,这个问题是点插值问题(类似邻近值)和范围插值问题(类似Bilinear、Bicubic)

范围插值问题除了图形学里的取平均值,还会应用在查询最大值最小值

快速,近似,方块

mipmap就是由一张图生成一系列分辨率越来越小的图,进行存储

然后摞起来存储

图像金字塔

因为这些mipmap得到的分辨率小的图像,图像存储方面增加了1/3倍的存储

左边是模型投影的结果,右边纹理是展开的2D图像

mipmap要在近似的在一个正方形范围区域内做范围查询,立刻知道这个区域内的平均值是多少

50 :20 --  55 : 51

但是mipmap存储的是离散型的0,1,2,3....层图像,如果有的地方需要1.8层图像呢:再用插值就好了(对于图中不同层的纹理,使用插值(三线性插值)再进行过渡)


三线性插值

采样点在mipmap低一层时运用Bilinear得到插值,再在高一层运用Bilinear得到插值,最后用这两层的插值再进行插值,得到结果,一共三个步骤,叫做三线性插值

三线性插值的结果

mipmap的限制:

mipmap+trilinear出现了overbur的情况,是因为mipmap只能查询正方形,trilinear第三步骤也是近似插值

mipmap+trilinear所产生的这个问题,用各向异性过滤可以部分解决

各向异性过滤的结果

各向异性过滤使用了Ripmap,Ripmap将图片根据横轴竖轴宽长各除以一半

这能将不同长宽比的图片进行分辨减小的预存储,是mipmap没有的,开销是mipmap的3倍

各向异性过滤--Ripmap

屏幕上的一个像素投影到纹理图像上,很有可能各是不同的不规则的形状

如果这个时候用mipmap这样只能用方形的采样范围采样,就会产生overbur的情况

而Ripmap则可以对图中长条形的范围进行快速查询

但Ripmap仍然有限制,比如图中最大的那个斜着的矩形是不能很好查询

(因为Ripmap只是长宽可以调整,但范围的角度不能调整,不能把竖直的矩形范围变成倾斜的)

那么就可用EWA过滤的方法可以解决这个不能倾斜的问题

EWA过滤

但代价是用空间换质量

这节要累死了!(die)

Games101-lecture 09 着色的评论 (共 条)

分享到微博请遵守国家法律