纹理基本概念
在上一篇文章中,我们知道如何用metal在屏幕上画一个三角形,并且也了解了如何给顶点传递颜色来改变三角形的颜色。但是在计算机图形中仅仅靠程序指定颜色是远远不够的,如果想要图像看起来逼真生动,那么就需要使用纹理。本文介绍如何在metal中使用纹理,包括从一副图片构造纹理,然后从纹理采样,并贴到之前的三角形上给。
在GPU中的纹理,可以理解为GPU中的一个内存,这个内存可以由CPU去更新数据。例如可以在CPU读取图像的数据到内存,然后更新GPU中的纹理。而采样是一个动作,它控制GPU在画图时如何从纹理读取数据。
纹理坐标
在metal中,纹理的原点坐标在左上角,这和openGL是不同的(OpenGL的纹理原点坐标在左下角),如下图所示:
当把图像的数据上传到纹理时,需要保持图像和纹理的坐标一致。一般来说纹理是有大小的,比如上传一个800X600的图像,所创建的纹理大小也应该是800X600。但是在metal使用这个纹理的时候,一般是使用的一个归一化的坐标,横坐标和纵坐标都是从0到1,我们把这个归一化的坐标叫做纹理坐标。也就是左上角的坐标为(0, 0),右下角的坐标为(1, 1)。采样的时候是通过纹理坐标来获取纹理对应的颜色。
纹理过滤
纹理是有大小的,它是由一定数量的像素点组成的,但是当在画图的时候,有可能要贴图的物体大小和纹理的大小不一致,这时候就需要告诉GPU如何将纹理的像素映射到纹理坐标,这一个过程就叫过滤,metal提供两种过滤的方式nearest和linear。nearest是简单的找一个离纹理坐标最近的像素点的值,这种方式速度非常快,但是在放大的时候,会产生块状现象。linear是找到纹理坐标周围4个像素点,然后给根据像素点离纹理坐标的距离产生一个权重,最终进行相加得到一个数值。linear可以产生比nearest更好的效果,但是效率上来说低一点。
可以知道分别有放大和缩小两种情况,当纹理小于被画的物体时,是放大(magnification),当大于被画的物体时,是缩小(minification),可以对这两种情况设置不同的filter。
纹理环绕
通常来说纹理的坐标应该设置为0到1之间的数值,但是当超出0到1的范围,也是可以的。这时候就需要设置纹理的环绕方式,Metal把这个行为称之为Ad