Swift:将int元组转换为包含浮点向量的自定义类型

时间:2019-06-26 21:37:27

标签: swift metal

这两个问题的原始答案都令人满意,但是以稍微不同的方式得出解决方案。我选择了一种我认为更易于实现的方法

我正在尝试将一些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

我的应用程序在加载时崩溃。

2 个答案:

答案 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))]