我想将数组数据从 Swift 传递到 Metal 的 Uniform 片段着色器

问题描述 投票:0回答:1

我正在尝试将 Uniform 数组数据从 Swift 传递到 Metal 的片段着色器。我可以毫无问题地传递非数组的普通浮点数。

结构如下

struct Uniforms {
    var test: [Float]
}

数值如下

let floatArray: [Float] = [0.5]

像往常一样,我们将编写并传递以下内容如上所述,正常的 Float 值可以毫无问题地传递。

commandEncoder.setFragmentBytes(&uniforms, length: MemoryLayout<Uniforms>.stride, index: 0)

着色器端应如下所示

//制服

struct Uniforms {
    float test[1];
};
Fragment Shader

// in fragment shader
float testColor = 1.0;
 // for statement
for (int i = 0; i < 1; i++) {
    testColor *= uniforms.test[i];
}

float a = 1.0 - testColor;

return float4(1.0,0.0,0.0,a);

我以为数组里的0.5传了,但是没有传值。我觉得我写错了,但是我该怎么写呢?

swift metal
1个回答
0
投票

你写的代码没有任何意义

struct Uniforms {
    var test: [Float]
}

Uniforms 在这里是一个 swift 结构体,如果你在内存中查看它,它将包含一个作为

Array
实现的一部分的结构体。因此,当您将指针指向
uniforms
时,您看不到浮动,而是看到
Array
的内部位。

您需要定义一个如下所示的 C 结构体

struct Uniforms {
    float test[1];
};

然后将此桥接标头包含在着色器代码中,并将其用作 Swift 中的桥接标头。

反过来,Swift 将为该结构生成一个 Swift 接口。

然后您可以填写该结构并使用

set*Bytes
函数将其传递给 Metal,或者将该结构放入
MTLBuffer
中并以这种方式传递。

© www.soinside.com 2019 - 2024. All rights reserved.