Unity Shader unity文档学习笔记(十五):纹理映射

每个顶点都存储着 齐次坐标(位置),法线,UV坐标
那给一个模型一张贴图它是怎么对应UV坐标的关系的呢
简而言之就是对每个光栅化的屏幕坐标算出它的uv坐标(利用三角形顶点重心坐标插值),再利用这个uv坐标去查询texture上的颜色

正常的图片
在这里插入图片描述

纹理映射的两个问题:过大或者过小
纹理过小:
也能想象到 就是周围几个像素都是对应某个UV坐标
这样看起来 肯定是像素一块一块的 不好看
可以使用双线性插值(Bilinear Interpolation):
简单点理解就是 某个点的颜色不是由纹理映射的颜色决定的
取出离红色点最近的4个黑色顶点
在这里插入图片描述
在这里插入图片描述
效果
在这里插入图片描述
纹理过大:
一个像素对应几个纹理像素 肯定是没办法正确还原原来的图片的
在这里插入图片描述
两个解析:
1 如开头所说,地板上铺满了重复的方格贴图,根据近大远小,远处的一张完整的贴图可能在屏幕空间中仅仅是几个像素的大小,那么必然屏幕空间的一个像素对应了纹理贴图上的一片范围的点,这其实就是纹理过大所导致的,直观来说想用一个点采样的结果代替纹理空间一片范围的颜色信息,必然会导致严重失真!(从信号的角度来说就是,采样频率过低无法还原信号原貌)
2 换一种想法,考虑离相机很远的一个三角形面,假设该三角形面真正在纹理贴图上对应的一片区域有10个像素点。但是由于透视的关系,距离很远的三角形面投影到近平面时可能只有1个或2个像素点的大小(远远小于10个像素的原来大小),那么这1个或2个像素采样texture的结果就要代表原来这个三角形面10个像素点的颜色信息,自然会导致失真!
有种办法是 一个像素加几个采样点 但性能很差
正常的Mipmap 看起来还是有问题
在这里插入图片描述
毕竟某些区域的顶点对应纹理是过高或者过宽的 但为什么会过高或者过宽呢?
当纹理由于角度而投影成一个透视角度时,通常会导致其一个维度比另一个维度变形更大。一个很好的例子是带纹理的地平面。在一定距离处,纹理的前后尺寸将比左右尺寸小得多
于是有了这种做法是各向异性过滤 加 Mipmap
在这里插入图片描述
参考链接
基础渲染系列(二)——着色器.
计算机图形学七:纹理映射(Texture Mapping)及Mipmap技术.

猜你喜欢

转载自blog.csdn.net/qq_43204246/article/details/118177368