如何使用Swift将Float制服传递给iOS Metal着色器?

时间:2014-10-10 11:54:29

标签: 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.0);
}

现在我想将它传递给着色器:

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

如何传递单个浮点值?

2 个答案:

答案 0 :(得分:10)

同样在10.11+和iOS 9+中你可以使用:

public func setVertexBytes(bytes: UnsafePointer<Void>, length: Int, atIndex index: Int)

如果您仅使用缓冲区一次(并且您的数据长度小于4K),则记录为比创建MTLBuffer更好。

答案 1 :(得分:8)

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

setVertexBuffer(buffer: MTLBuffer?, offset: Int, atIndex index: Int)

在您的示例中,缓冲区将是具有单个浮点数的数组。 要将制服传递给片段着色器,请使用setFragmentBuffer。