【GAMES101】09 shading3

重心坐标做插值

三角形顶点的属性:纹理坐标、颜色、法线方向……

重心坐标

(重心坐标定义在一套三角形上,换一个三角形就不是这样了)

重心坐标:三角形平面上任一点可被线性表示。
在这里插入图片描述
注:如果点在三角形内,三个系数非负;非则是在三角形的平面上。

重心坐标求解

在这里插入图片描述

三角形重心:把大三角形分成等面积的三部分。
在这里插入图片描述

重心坐标一般表达式:
在这里插入图片描述

三角形内任意属性用重心坐标插值表示:
在这里插入图片描述

注:三维空间中,当三角形投影到某个面上去,它的重心坐标可能会改变!!
即应该在投影的三角形中,逆变换得到三维坐标,计算三维坐标中的三角形内的点P属性,而不能用投影后的点做!

纹理坐标怎么贴图

在这里插入图片描述
这样做带来的问题:

1. 若纹理太小:

在这里插入图片描述

最左,直接四舍五入;
中间,双线性插值平滑过渡,取周围四个点;(眼角弧度有锯齿状)
最右:任意一个点,取周围16各,三次插值

屏幕上的比如33 / 55 范围内的像素都被映射到纹理上的同一个纹素(屏幕上的点对应到纹理上为小数,四舍五入,则屏幕上多个点对应纹理上同一个纹素,导致模糊),如何解决?---->双线性插值
在这里插入图片描述

双线性插值:
在这里插入图片描述
则红点综合考虑了周围四个点的颜色。即实现了很小的图(纹理)放大(到屏幕大小),查询任何一个非整形位置上的值(做双线性插值),得到平滑过渡的结果。

2. 若纹理大了:

在这里插入图片描述
出现走样问题,远处:摩尔纹;近处:锯齿。

近处:屏幕上一个像素占纹理区域小; 远处:屏幕上一个像素占纹理区域大。
在这里插入图片描述
若一个接近地平线的像素(覆盖很大纹理区域),如果还是认为屏幕上一个像素是整个纹理区域的平均值----->错误 (此时就不能用像素中心采样)

解决:抗锯齿 MSAA / 超采样
一个像素用更多的样本采样。 比如 一个像素 分成512个点,去对应纹理。(但是会把算法变慢)

走样产生:信号变化块但采样频率跟不上。
纹理过大:一个像素内部可能包含很大块纹理,(一个像素内信号变化频率很高),所以此时要用更高频率的采样方法,即一个像素内要取许多个采样点。
在这里插入图片描述

当然,不想用这么多采样点,如下方法。

范围查询

避免采样。(点查询问题,给一个点值是多少,双线性插值;范围查询问题range query,给一个区域立刻知道范围内的平均值)
在这里插入图片描述

mipmap

在这里插入图片描述
mipmap 允许做范围查询,特点:快、近似、只能做正方形范围查询。
在这里插入图片描述
后一张图分辨率较前一张图缩小一半.
一共log2n层(n为分辨率)。

渲染之前,拿到纹理,先生成对应的mipmap。

mipmap , cv里也叫图像金字塔。
在这里插入图片描述

原本图,存储是1,所有的图加一起,存储量是4/3(等比数列计算1+1/4+1/16+…),也就是额外存储是原本的1/3。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
mipmap可视化
在这里插入图片描述

目前是离散的,1、2、3…层,不希望在不连续的地方查询,可能会出现缝隙,比如查1.8层---->三线性插值。(各层先分别双线性插值,再层与层之间线性插值)(在游戏中有这个选项)
在这里插入图片描述

在这里插入图片描述
(柱子上,是几何本身的问题,现在不说)

mipmap限制

假设512像素超采样结果是正确的,如下:

在这里插入图片描述

但是mipmap 在远处会overblur模糊过分。
原因:因为mipmap只能查询正方形范围内的平均值;另外三线性插值带来误差。
在这里插入图片描述

各向异性过滤:(效果比三线性插值好)
在这里插入图片描述

mipmap,计算的是对角线上的图,但有的图长宽比不同,各向异性过滤 anisotropic filtering 增加了沿水平方向和竖直方向压缩的图,那被压缩图上的一个像素映射到原图上就是一个矩形区域,而不是正方形区域。
在这里插入图片描述

屏幕上任何一个像素映射到纹理上,不一定是规律的形状,如果很斜的细矩形,让正方形框框住的话,就是求了一个更大区域的平均,也就是overblur;各向异性过滤允许查询一个长条形区域。
在这里插入图片描述

对斜着的如何解决?----> EWA filtering
任意不规则形状,可以被拆成不同的圆形,去覆盖这个不规则形状,如图椭圆,可以拆成三个不同的圆形,每次查询一个圆形、多次查询就可以覆盖这个椭圆。
在这里插入图片描述

总结:(代价)
mipmap,额外的开销是原图的1/3;
各向异性过滤,额外的开销是原图的3倍;

(各项异性:在不同方向上表现各不相同。比如矩形水平和竖直表现完全相同—>各向同性。)
在这里插入图片描述

纹理的其他应用

环境贴图/环境光照

在这里插入图片描述
用纹理描述环境光,用环境光去渲染,如上茶壶。

connel box:验证全局光照技术工具。

用纹理记录环境光:假设环境光来自无限远处(即只要记录方向就可以)

环境光记录在球面上

在这里插入图片描述
再展开:在这里插入图片描述
但会产生扭曲问题。
解决办法:认为球有个包围盒,把光照i信息存在包围盒上,得到六张图。
在这里插入图片描述
在这里插入图片描述
立方体各个面都是均匀的,所以无扭曲问题。
存在问题:现在已知一个方向,要得到光照信息,要先计算在立方体的哪个面上。

凹凸贴图

比如原本有个基础高度,纹理可以定义相对这个基础高度的变化。

相对高度变化——>法线变化——>shading变化

凹凸贴图/法线贴图:人为给一个假的法线,在任一点可以通过纹理映射求出假的法线,得到假的着色结果,欺骗人的眼睛,但实际物体的几何没变化。
在这里插入图片描述
法线贴图: 定义一个复杂纹理,但不改变任何几何信息,所以三角形数量不变。 把任何一个像素的法线做一个扰动(通过定义的不同位置的高度,和临近位置的高度差,计算新的法线; 即纹理定义的是任一点相对高度的移动,通过高度变化来改变法线)
在这里插入图片描述

不考虑二维纹理、三维空间,仅考虑一维的平面,如下:
在这里插入图片描述
实际情况下:
在这里插入图片描述

位移贴图

相对凹凸贴图,真的会改变顶点的位置。如下:

凹凸贴图不改变几何,在边缘的地方会露馅;自己的几何相对复杂产生自己的阴影不能投影到自己上面。
在这里插入图片描述

凹凸贴图:实际没改变几何,只是通过法线变化,欺骗人的眼睛,产生凹凸的感觉;
而位移贴图:改变了实际顶点的位置。代价:要求三角形足够细致,顶点之间的间隔比纹理频率高(采样率足够高)

开始先用粗糙的模型,应用位移贴图过程中,检测是否需要三角形更细致,如果需要,把三角形拆成小的三角形——>directx(只有windows可)的dynamic tessellation动态细分。

三维纹理

对大理石等纹理:定义一个三维空间中的噪声函数,经过一系列操作,可以得到想要的值。(perlin noise)
在这里插入图片描述

纹理可以记录之前算好的信息

如下,着色结果 * 计算好的环境光遮蔽(被记录在纹理中):
在这里插入图片描述

三维纹理广泛应用在体渲染

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值