什么是纹理
宏观的角度上来说就是一张2D图片,一个像素上有 RGB 值
为什么要出现纹理
1、降低建模工作量 = 牺牲几何细节
2、降低存储空间
3、提高读取速度
纹理管线
模型空间位置 → 投影函数 → 纹理映射 → 纹理坐标 → 通讯函数 → 新纹理坐标 → 纹理采样 [避免依赖纹理读取] → 纹理值
假设 我们将模型空间的一个点投影到 UV 坐标,获得一个 UV 坐标值,假设这个纹理的大小是256 * 256,那么这个纹理就会跟这个点投影的 UV 坐标进行相乘,得到纹理的坐标,后续这个位置的颜色需要看你的纹理采样的设置进行设置
纹素
纹素:图像纹理上的像素通常被称为纹素,以区分它和屏幕上的像素
纹理采样设置之 Wrap Mode
决定 UV 值在[0,1]以外的表现
OpenGL -- "包装模式"(Wrapping Model)
DirectX -- "纹理寻址模式"(Texture Addressing Mode)
Repeat —— 重复
Mirror —— 镜像
Clamp —— 这个图形的边界
Border —— 当超过这个范围的其他位置的颜色需要设置
纹理采样设置之 Filter Model
过滤设置,当纹理通过变化产生拉伸的时候,要使用哪种滤波来进行纹理的表现
最邻近
最邻近插值,思想就是他的名字,找插入像素点位置的最邻近的像素点,将其作为自己的像素值插入。
缩放公式为:
-
根据横轴,即宽可得:X/x = W/w
-
根据纵轴,即高可得:Y/y = H/h
-
那么能够得到 f(X,Y)= f( W/w * x, H/h *y)
因此这个时候缩放后的图片像素点(x,y)的像素值就对应着原图像素点( W/w * x, H/h *y)的像素值
但是这个时候会出现一个问题就是因为缩放比例的原因,会导致像素点( W/w * x, H/h *y)中的值不是整数,那么就不知道应该对应的是哪个像素点的像素值
这个时候最邻近插值算法使用的方法就是四舍五入法,表示为[.],所以像素值f(x,y) = f( [W/w * x], [H/h *y])
举个例子,如果原图为55,缩放后的图为33,那么缩放后的图的像素点(1,1)对应的就是原图中([5/3 * 1], [5/3 * 1