我正在尝试将 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传了,但是没有传值。我觉得我写错了,但是我该怎么写呢?
你写的代码没有任何意义
struct Uniforms {
var test: [Float]
}
Uniforms 在这里是一个 swift 结构体,如果你在内存中查看它,它将包含一个作为
Array
实现的一部分的结构体。因此,当您将指针指向 uniforms
时,您看不到浮动,而是看到 Array
的内部位。
您需要定义一个如下所示的 C 结构体
struct Uniforms {
float test[1];
};
然后将此桥接标头包含在着色器代码中,并将其用作 Swift 中的桥接标头。
反过来,Swift 将为该结构生成一个 Swift 接口。
然后您可以填写该结构并使用
set*Bytes
函数将其传递给 Metal,或者将该结构放入 MTLBuffer
中并以这种方式传递。