顶点数据的容器,它构成三维对象或几何图形定义的一部分。
class SCNGeometrySource : NSObject
因为大多数几何图形使用不止一个几何图形源,并且GPU通常将来自多个数据源的数据一起使用,所以您可以通过在同一数组中交织多个语义的顶点数据来实现自定义几何图形的更好渲染性能。
为此,首先创建一个数组,其中每个元素都包含同一顶点的多种语义的值。 接下来,从该数组创建一个NSData对象,并使用offset和stride参数从该数据创建每个几何源,以指定可以在数组中找到每种语义的值的位置。 为了更方便地指定向量的大小和位置,可以为顶点定义自己的数据结构,并使用sizeof函数(在Objective-C中为offsetof),如清单1所示。
typedef struct {
float x, y, z; // position
float nx, ny, nz; // normal
float s, t; // texture coordinates
} MyVertex;
MyVertex vertices[VERTEX_COUNT] = { /* ... vertex data ... */ };
NSData *data = [NSData dataWithBytes:vertices length:sizeof(vertices)];
SCNGeometrySource *vertexSource, *normalSource, *tcoordSource;
vertexSource = [SCNGeometrySource geometrySourceWithData:data
semantic:SCNGeometrySourceSemanticVertex
vectorCount:VERTEX_COUNT
floatComponents:YES
componentsPerVector:3 // x, y, z
bytesPerComponent:sizeof(float)
dataOffset:offsetof(MyVertex, x)
dataStride:sizeof(MyVertex)];
normalSource = [SCNGeometrySource geometrySourceWithData:data
semantic:SCNGeometrySourceSemanticNormal
vectorCount:VERTEX_COUNT
floatComponents:YES
componentsPerVector:3 // nx, ny, nz
bytesPerComponent:sizeof(float)
dataOffset:offsetof(MyVertex, nx)
dataStride:sizeof(MyVertex)];
tcoordSource = [SCNGeometrySource geometrySourceWithData:data
semantic:SCNGeometrySourceSemanticTexcoord
vectorCount:VERTEX_COUNT
floatComponents:YES
componentsPerVector:2 // s, t
bytesPerComponent:sizeof(float)
dataOffset:offsetof(MyVertex, s)
dataStride:sizeof(MyVertex)];
上面的这个类方法,其实就是下面的这个init的初始化方法
convenience init(data: Data, semantic: SCNGeometrySource.Semantic, vectorCount: Int, usesFloatComponents floatComponents: Bool, componentsPerVector: Int, bytesPerComponent: Int, dataOffset offset: Int, dataStride stride: Int)
下面三个初始化方法是上面的一个方法的拆解
![](https://img.haomeiwen.com/i4474910/c744b2718d4774c7.png)
var data: Data { get }
The data for the geometry source.
几何源的数据
var semantic: SCNGeometrySource.Semantic { get }
几何源为每个顶点描述的语义值(或属性)。
var vectorCount: Int { get }
The number of vectors in the data.
var usesFloatComponents: Bool { get }
一个布尔值,指示矢量分量是否为浮点值。
var componentsPerVector: Int { get }
每个向量中的标量分量数。
var bytesPerComponent: Int { get }
每个向量分量的大小(以字节为单位)。
var dataOffset: Int { get }
从数据开头到要在几何图形源中使用的第一个矢量分量的偏移量(以字节为单位)。
var dataStride: Int { get }
从向量到数据中的下一个字节的字节数。
额外的一个初始化方法
![](https://img.haomeiwen.com/i4474910/17313d9b0f7a58c2.png)
网友评论