如何使用Swift将浮动均匀性传递给iOS金属着色器?

如何使用Swift将浮动均匀性传递给iOS金属着色器?,ios,swift,metal,Ios,Swift,Metal,我想把一个浮点数传递给我的金属着色器。我不知道怎么做 这是我的着色器: vertex float4 model_vertex(unsigned int iid[[instance_id]] constant float angle) { float number = float(iid) / 64.0; return float4(number * sin(angle), number * cos(angle), 0.0, 1

我想把一个浮点数传递给我的金属着色器。我不知道怎么做

这是我的着色器:

vertex float4 model_vertex(unsigned int iid[[instance_id]]
                           constant float angle) {
    float number = float(iid) / 64.0;
    return float4(number * sin(angle), number * cos(angle), 0.0, 1.0);
}
现在我想将其传递给着色器:

let renderPassDescriptor = MTLRenderPassDescriptor()
let renderEncoder = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
// ...
let angle: Float = 0.5
renderEncoder.setUniform1(angle) // What do I do here?

如何传递单浮点值?

我以前没有见过setUniform*。要将制服传递到顶点着色器,请使用:

setVertexBuffer(buffer: MTLBuffer?, offset: Int, atIndex index: Int)
其中,在您的示例中,缓冲区是一个具有单个浮点的数组。
要将制服传递给片段着色器,请使用setFragmentBuffer。

在10.11+和iOS 9+中,您还可以使用:

public func setVertexBytes(bytes: UnsafePointer<Void>, length: Int, atIndex index: Int)
public func setVertexBytes(字节:UnsafePointer,长度:Int,索引:Int)

如果只使用一次缓冲区(且数据长度小于4K),那么它比创建MTLBuffer要好。

这可能是显而易见的,但OP的问题是有一个顶点着色器,并且
setFragmentBytes
将数据发送到片段着色器,因此,如果希望将数据发送到顶点着色器,请改用
setVertexBytes