顶点数据
顶点数据(Vertex Data)是指一系列顶点的集合,这些顶点用于图形渲染管线的输入。每个顶点通常包含位置、颜色、纹理坐标等属性信息
mesh网络
Mesh网络是指metal中通过将不同数量形状的三角形拼在一起覆盖在要绘制图形表面的网络
顶点数组
顶点数据组成的数组需要传递给GPU时有两种方式,直接使用数组,使用setVertexBytes(_:length:index:),但是这种对数组大小有限制(网上查询是4K,未验证)大家感兴趣的可以验证下试试。如果数据量比较大可以将顶点数组封装为MTLBuffer
索引数组
Metal过程中mesh网络拼接过程中有很多的顶点数据是重复的,为了避免重复通过提供一个没有重复的顶点数组,再结合一个索引数组,渲染时根据索引数组中的索引去顶点数组中取数据,可以减少数据传输、内存使用,提高渲染效率
颜色
Metal中颜色主要是通过Metal Shading Language 中 主要是 float4 来表示颜色,float4 是一个数据类型,用于表示一个包含4个浮点数的向量,具体来说,float4包含x、y、z和w四个分量,每个分量都是一个浮点数。表示颜色时每个分向量的取值范围是0~1,每个分向量含义分别对应如下x:R,y:G,z:B,z:A,在swift中我们表示颜色时使用SIMD4
NDC坐标
NDC坐标全称( Normalized Device Coordinates)NDC是一个用于表示和处理图形的坐标系统,通常用于将不同设备或不同分辨率的屏幕上的坐标统一到一个标准化的范围内,便于编程和处理。其坐标范围通常是从[-1,1]在x和y轴上,z轴上则是从0到1。它是将模型空间中的三维坐标转换为屏幕空间坐标之前的一个中间步骤,目的是将可视范围(Frustum)压缩至以远点为中心,边长为2的标准正方形(Canonical Cube)这个很重要,GPU识别的坐标都是转化后的NDC坐标,下面是NDC坐标转换公式
对于x坐标:
对于y坐标:
其中, S c r e e n x 和 S c r e e n y是屏幕上的坐标点, S c r e e n w i d t h 和 S c r e e n h e i g h t分别是屏幕的宽度和高度。
UV坐标
UV坐标是用于映射2D纹理到3D模型表面的2D坐标系统,水平方向是U,垂直方向是V。通过这个坐标系,可以定位图像上的任意一个像素。在3D模型上,每个顶点都有一个对应的UV坐标,它告诉渲染引擎在纹理上的哪个位置找到该顶点的颜色。UV坐标的原始范围通常是[0,1]。在不同的shader体系中,UV坐标的原点位置可能不同, 转换公式:
let screenWidth = UIScreen.main.bounds.width
let screenHeight = UIScreen.main.bounds.height
let u = x / screenWidth
let v = y / screenHeight
这个UV坐标可以用于纹理映射、图像处理或者任何需要这种坐标形式的场景。
需要注意的是,这种转换是线性的,并且假设屏幕的左上角是坐标原点(0,0),右下角是(screenWidth,screenHeight)。如果你的应用场景有不同的坐标原点或方向,你需要相应地调整转换公式。
左手坐标系
左手坐标系是一个三维空间的直角坐标系,用于确定空间位置。伸出左手,让拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,那么这个坐标系就是左手直角坐标系。
右手坐标系
右手坐标系是在空间中规定直角坐标系的方法之一。把右手放在原点的位置,使大拇指、食指和中指互成直角,把大拇指指向x轴的正方向,食指指向y轴的正方向时,中指所指的方向就是z轴的正方向
MTLBuffer
MTLBuffer是Metal框架中的一个概念,代表了一块存储在GPU内存中的数据缓冲区,用于在GPU和CPU之间传输数据,并且通常用于向GPU发送顶点数据、纹理数据或其他计算所需的数据
纹理
在Metal中,纹理是GPU中的一个内存区域,可以由CPU更新数据,用于存储图像数据,并在渲染时通过采样将纹理映射到物体上。