教程 2
纹理贴图
教程源码下载地址: https://github.com/jiangxh1992/MetalTutorialDemos
CSDN完整版专栏: https://blog.csdn.net/cordova/category_9734156.html
一、关键词
- UV坐标系
- MTLTexture
- MTKTextureLoader贴图加载
- Metal采样对象sampler
- Filtering纹理滤波
- Mipmaps
- Addressing纹理寻址
二、原理
2.1 什么是纹理贴图
纹理texture就像是模型表面的皮肤,在没有光照计算的前提下为表面提供基础的色彩内容,纹理可以体现物体表面的性质,使物体看上去更加真实。上一章我们在片段着色器直接简单返回一个红色,相当于为模型贴了一张纯红色的纹理,只不过没有从外部的贴图资源上采样颜色。
纹理贴图通常是一张二维的图片,纹理贴图将图像离散为一定数量的像素,称为纹素,纹素最终会映射到屏幕上的像素上。
2.2 MTLTexture
MTLTexture是Metal中保存贴图数据的一张纹理缓冲,可以理解为一个framebuffer,可通过配置设置贴图是否可读可写,贴图的尺寸,贴图保存的图像数据格式等。MTLTexture在创建的时候有其decriptor对象:MTLTextureDescriptor。可以设置MTLTextureDescriptor来配置纹理贴图的属性和操作,包括后期高级设置中的storgeMode来控制贴图在内存中的存储方式等。
MTLTextureDescriptor *textureDescriptor = [[MTLTextureDescriptor alloc] init];
textureDescriptor.pixelFormat = MTLPixelFormatBGRA8Unorm;
textureDescriptor.width = image.width;
textureDescriptor.height = image.height;
id<MTLTexture> texture = [_device newTextureWithDescriptor:textureDescriptor];
2.3 纹理空间
纹理空间是针对纹理贴图的二维坐标空间,定义在0~1单位坐标系内,和屏幕分辨率宽高比无关。单位化的纹理空间坐标最终通过变换映射到(0,0)~(width,height)的屏幕空间。
纹理坐标又称uv,是在纹理自身的单位纹理空间中定义的,纹理坐标的值在0~1之间,这样确定了模型顶点的纹理坐标后,可以替换不同的纹理,无需更改纹理坐标值。Metal中纹理空间的坐标系如下,左上角为原点(不同于OpenGL纹理坐标空间原点在左下角):