这两个问题的原始答案都令人满意,但是以稍微不同的方式得出解决方案。我选择了一种我认为更易于实现的方法
我正在尝试将一些ObjectiveC,from this apple metal doc/example和金属代码转换为快速代码,但在此方面遇到一些麻烦:
这是我正在使用的typedef,这是必需的,以便金属着色器可以计算我的顶点数据(simd.h中的浮点向量很重要):
#include <simd/simd.h>
typedef struct
{
vector_float2 position;
vector_float4 color;
} AAPLVertex;
在目标C中,您可以执行此操作以将某些数据转换为该类型:
static const AAPLVertex triangleVertices[] =
{
// 2D positions, RGBA colors
{ { 250, -250 }, { 1, 1, 1, 1 } },
{ { -250, -250 }, { 1, 1, 0, 1 } },
{ { 0, 250 }, { 0, 1, 1, 1 } },
};
但是您如何在Swift中做到这一点?我已经尝试过了:
private let triangleVertices = [
( (250, -250), (1, 0, 1, 1) ),
( (-250, -250), (1, 1, 0, 1) ),
( (0, 250), (0, 1, 1, 1) )
] as? [AAPLVertex]
但是xcode告诉我:
Cast from '[((Int, Int), (Int, Int, Int, Int))]' to unrelated type '[AAPLVertex]' always fails
我的应用程序在加载时崩溃。
答案 0 :(得分:2)
这是我要实现的方式:
import simd
struct Vertex {
var position: SIMD2<Float>
var color: SIMD4<Float>
}
extension Vertex {
init(x: Float, y: Float, r: Float, g: Float, b: Float, a: Float = 1.0) {
self.init(position: SIMD2(x, y), color: SIMD4(r, g, b, a))
}
}
let triangleVertices = [
Vertex(x: +250, y: -250, r: 1, g: 0, b: 1),
Vertex(x: -250, y: -250, r: 1, g: 1, b: 0),
Vertex(x: 0, y: -250, r: 0, g: 1, b: 1),
]
但是,我不确定与Objective C ones相比,Swift本机SIMD类型与Metal兼容的程度如何,尽管我怀疑它们是可互操作的。
答案 1 :(得分:1)
尝试这样:
import simd
struct AAPLVertex {
let position: float2
let color: float4
}
let triangleVertices: [AAPLVertex] = [
// 2D positions, RGBA colors
.init(position: .init( 250, -250), color: .init(1, 0, 1, 1)),
.init(position: .init(-250, -250), color: .init(1, 1, 0, 1)),
.init(position: .init( 0, -250), color: .init(0, 1, 1, 1))]