如何在Swift与Metal的桥接头中使用packed_float3?
桥接头用Metal打包浮点类型的正确姿势
为啥你写的代码会报错?因为packed_float3是Metal着色器语言(MSL)独有的类型,根本不能直接在C/ObjC的桥接头里用。而你试的MTLPackedFloat3是Apple官方提供的Objective-C对应类型,但得用对方法,不然也会出问题。
下面是不用自定义类型的解决步骤:
桥接头里正确引头文件
先把Metal的头文件引入桥接头,然后用MTLPackedFloat3定义结构体:#import <Metal/Metal.h> typedef struct { MTLPackedFloat3 value; } CustomData;注意:要是引了头文件还报错,去Xcode项目设置里检查下有没有链接Metal框架——Build Phases -> Link Binary With Libraries里加个Metal.framework就行。
着色器里对应类型
到Metal着色器代码里,还是用packed_float3来接收,它和MTLPackedFloat3的内存布局完全一致(都是3个连续的float,总共12字节,没多余填充):struct CustomData { packed_float3 value; }; vertex VertexOut vertexShader(constant CustomData& input [[buffer(0)]]) { // 这里写你的着色器逻辑 }Swift里直接用
Swift会自动把MTLPackedFloat3桥接成可用的结构体,你直接创建赋值就行:let packedValue = MTLPackedFloat3(x: 1.0, y: 2.0, z: 3.0) let customData = CustomData(value: packedValue)要是习惯用
SIMD3<Float>,也能直接转,因为内存布局兼容:let simdValue = SIMD3<Float>(1.0, 2.0, 3.0) var customData = CustomData() memcpy(&customData.value, &simdValue, MemoryLayout<MTLPackedFloat3>.size)
提醒一句:别在桥接头里用packed_simd_float3这种类型,那是着色器里才有的,C/ObjC根本不认。
内容的提问来源于stack exchange,提问作者Matt Bierner
相关产品推荐
相关产品推荐

